Opened 5 years ago

Closed 5 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)

2.sgi (2.3 MB) - added by ami_stuff 5 years ago.

Change History (3)

Changed 5 years ago by ami_stuff

comment:1 Changed 5 years ago by cehoyos

  • Component changed from undetermined to avcodec
  • Keywords sgi regression added
  • Reproduced by developer set
  • Status changed from new to open
  • Version changed from unspecified to git-master

comment:2 Changed 5 years ago by cehoyos

  • Resolution set to fixed
  • Status changed from open to closed

Fixed by Reimar.

Note: See TracTickets for help on using tickets.