Opened 13 years ago
Closed 13 years ago
#899 closed defect (fixed)
sgi: old regression
Reported by: | ami_stuff | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | avcodec |
Version: | git-master | Keywords: | sgi regression |
Cc: | Blocked By: | ||
Blocking: | Reproduced by developer: | yes | |
Analyzed by developer: | no |
Description
this patch introduced white line at the right side in the output:
Date: Sat Sep 19 13:42:41 2009 New Revision: 19926 Log: Support uncompressed 16 bit sgi image format, as e.g. used by the files at http://media.xiph.org/svt/2160p50_CgrLevels_Master_SVTdec05_/1_CrowdRun_2160p50_CgrLevels_MASTER_SVTdec05_/ Modified: trunk/libavcodec/sgidec.c Modified: trunk/libavcodec/sgidec.c ============================================================================== --- trunk/libavcodec/sgidec.c Sat Sep 19 13:36:51 2009 (r19925) +++ trunk/libavcodec/sgidec.c Sat Sep 19 13:42:41 2009 (r19926) @@ -28,6 +28,7 @@ typedef struct SgiState { unsigned int width; unsigned int height; unsigned int depth; + unsigned int bytes_per_channel; int linesize; } SgiState; @@ -125,7 +126,7 @@ static int read_uncompressed_sgi(unsigne { int x, y, z; const uint8_t *ptr; - unsigned int offset = s->height * s->width; + unsigned int offset = s->height * s->width * s->bytes_per_channel; /* Test buffer size. */ if (offset * s->depth > in_end - in_buf) { @@ -135,9 +136,10 @@ static int read_uncompressed_sgi(unsigne for (y = s->height - 1; y >= 0; y--) { out_end = out_buf + (y * s->linesize); for (x = s->width; x > 0; x--) { - ptr = in_buf++; + ptr = in_buf += s->bytes_per_channel; for(z = 0; z < s->depth; z ++) { - bytestream_put_byte(&out_end, *ptr); + memcpy(out_end, ptr, s->bytes_per_channel); + out_end += s->bytes_per_channel; ptr += offset; } } @@ -155,7 +157,7 @@ static int decode_frame(AVCodecContext * AVFrame *picture = data; AVFrame *p = &s->picture; const uint8_t *in_end = in_buf + buf_size; - unsigned int dimension, bytes_per_channel, rle; + unsigned int dimension, rle; int ret = 0; uint8_t *out_buf, *out_end; @@ -171,13 +173,13 @@ static int decode_frame(AVCodecContext * } rle = bytestream_get_byte(&in_buf); - bytes_per_channel = bytestream_get_byte(&in_buf); + s->bytes_per_channel = bytestream_get_byte(&in_buf); dimension = bytestream_get_be16(&in_buf); s->width = bytestream_get_be16(&in_buf); s->height = bytestream_get_be16(&in_buf); s->depth = bytestream_get_be16(&in_buf); - if (bytes_per_channel != 1) { + if (s->bytes_per_channel != 1 && (s->bytes_per_channel != 2 || rle)) { av_log(avctx, AV_LOG_ERROR, "wrong channel number\n"); return -1; } @@ -189,10 +191,10 @@ static int decode_frame(AVCodecContext * } if (s->depth == SGI_GRAYSCALE) { - avctx->pix_fmt = PIX_FMT_GRAY8; + avctx->pix_fmt = s->bytes_per_channel == 2 ? PIX_FMT_GRAY16BE : PIX_FMT_GRAY8; } else if (s->depth == SGI_RGB) { - avctx->pix_fmt = PIX_FMT_RGB24; - } else if (s->depth == SGI_RGBA) { + avctx->pix_fmt = s->bytes_per_channel == 2 ? PIX_FMT_RGB48BE : PIX_FMT_RGB24; + } else if (s->depth == SGI_RGBA && s->bytes_per_channel == 1) { avctx->pix_fmt = PIX_FMT_RGBA; } else { av_log(avctx, AV_LOG_ERROR, "wrong picture format\n");
C:\>ffmpeg -i 2.sgi out_2.tif ffmpeg version N-36492-g7f83db3, Copyright (c) 2000-2012 the FFmpeg developers built on Jan 5 2012 01:57:12 with gcc 4.6.2 configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-ru ntime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libope ncore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --en able-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger - -enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwben c --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable- libxvid --enable-zlib libavutil 51. 34.100 / 51. 34.100 libavcodec 53. 53.100 / 53. 53.100 libavformat 53. 29.100 / 53. 29.100 libavdevice 53. 4.100 / 53. 4.100 libavfilter 2. 57.101 / 2. 57.101 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 5.100 / 0. 5.100 libpostproc 51. 2.100 / 51. 2.100 Input #0, image2, from '2.sgi': Duration: 00:00:00.04, start: 0.000000, bitrate: N/A Stream #0:0: Video: sgi, rgb24, 1024x768, 25 tbr, 25 tbn, 25 tbc [buffer @ 020F14A0] w:1024 h:768 pixfmt:rgb24 tb:1/1000000 sar:0/1 sws_param: Output #0, image2, to 'out_2.tif': Metadata: encoder : Lavf53.29.100 Stream #0:0: Video: tiff, rgb24, 1024x768, q=2-31, 200 kb/s, 90k tbn, 25 tbc Stream mapping: Stream #0:0 -> #0:0 (sgi -> tiff) Press [q] to stop, [?] for help frame= 1 fps= 0 q=0.0 Lsize= 0kB time=00:00:00.04 bitrate= 0.0kbits/ s video:2325kB audio:0kB global headers:0kB muxing overhead -100.000000%
Attachments (1)
Change History (3)
by , 13 years ago
comment:1 by , 13 years ago
Component: | undetermined → avcodec |
---|---|
Keywords: | sgi regression added |
Reproduced by developer: | set |
Status: | new → open |
Version: | unspecified → git-master |
comment:2 by , 13 years ago
Resolution: | → fixed |
---|---|
Status: | open → closed |
Note:
See TracTickets
for help on using tickets.
Fixed by Reimar.