Opened 6 years ago

Closed 5 years ago

Last modified 4 years ago

#226 closed defect (fixed)

QT RLE 1bpp support is buggy

Reported by: ami_stuff Owned by:
Priority: normal Component: avcodec
Version: git-master Keywords: qtrle roundup
Cc: Blocked By:
Blocking: Reproduced by developer: yes
Analyzed by developer: no

Description

(issue 1529)

Author: ami_stuff 	Date: 2009-11-07.19:32:36 	

Attached QT RLE file decodes correctly except some gfx bugs:

1. at the beginning in the output AVI file there are visible white lines
2. there is visibe white line at the top of the screen

C:\>ffmpeg -i qt_rle_bw.mov -vcodec huffyuv qt_rle_bw.avi
FFmpeg version SVN-r20467, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  built on Nov  6 2009 04:04:33 with gcc 4.2.4
  configuration: --enable-memalign-hack --prefix=/mingw --cross-prefix=i686-ming
w32- --cc=ccache-i686-mingw32-gcc --target-os=mingw32 --arch=i686 --cpu=i686 --e
nable-avisynth --enable-gpl --enable-version3 --enable-zlib --enable-bzlib --ena
ble-libgsm --enable-libfaad --enable-pthreads --enable-libvorbis --enable-libthe
ora --enable-libspeex --enable-libmp3lame --enable-libopenjpeg --enable-libxvid
--enable-libschroedinger --enable-libx264 --enable-libopencore_amrwb --enable-li
bopencore_amrnb
  libavutil     50. 3. 0 / 50. 3. 0
  libavcodec    52.37. 1 / 52.37. 1
  libavformat   52.39. 2 / 52.39. 2
  libavdevice   52. 2. 0 / 52. 2. 0
  libswscale     0. 7. 1 /  0. 7. 1

Seems stream 0 codec frame rate differs from container frame rate: 1000000.00 (1
000000/1) -> 15.00 (500000/33333)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'qt_rle_bw.mov':
  Duration: 00:00:12.64, start: 0.000000, bitrate: 1197 kb/s
    Stream #0.0(eng): Video: qtrle, monow, 320x240, 1195 kb/s, 15 tbr, 1000k tbn
, 1000k tbc
  Metadata
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
Output #0, avi, to 'qt_rle_bw.avi':
    Stream #0.0(eng): Video: huffyuv, yuv422p, 320x240, q=2-31, 200 kb/s, 15 tbn
, 15 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Press [q] to stop encoding
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11522, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11524, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11522, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11532, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 44 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11526, pixel_limit = 11520
    Last message repeated 1 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11556, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 3 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11524, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11550, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11534, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 12 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11528, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 19 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11532, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 6 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11536, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 4 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11552, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11528, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 14 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11556, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 6 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11554, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 1 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11526, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11524, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 9 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11530, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11522, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11540, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 2 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11524, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 3 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11532, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11560, pixel_limit = 11520
    Last message repeated 13 times10410kB time=11.20 bitrate=7614.3kbits/s
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11526, pixel_limit = 11520
    Last message repeated 1 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11524, pixel_limit = 11520
    Last message repeated 1 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11534, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11522, pixel_limit = 11520
    Last message repeated 4 times
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11524, pixel_limit = 11520
[qtrle @ 0x1a08480]Problem: pixel_ptr = 11532, pixel_limit = 11520
frame=  190 fps=  0 q=0.0 Lsize=   11759kB time=12.67 bitrate=7605.2kbits/s
video:11749kB audio:0kB global headers:0kB muxing overhead 0.085112%
Author: cehoyos 	Date: 2009-12-29.20:41:05 	

Since the sample decodes, I believe this is a minor issue.

XAnim decodes the sample correctly:

/********************* * * * *******************************************/
xaULONG QT_Decode_RLE1(image,delta,dsize,dec_info)
xaUBYTE *image;         /* Image Buffer. */
xaUBYTE *delta;         /* delta data. */
xaULONG dsize;          /* delta size */
XA_DEC_INFO *dec_info;  /* Decoder Info Header */
{ xaULONG imagex = dec_info->imagex;    xaULONG imagey = dec_info->imagey;
  xaULONG map_flag = dec_info->map_flag;        xaULONG *map = dec_info->map;
  xaLONG x,y,d,lines; /* xaLONG min_x,max_x,min_y,max_y; */
  xaUBYTE *dptr;

  dptr = delta;
  dptr += 4;    /* skip codec size */
  d = (*dptr++) << 8;  d |= *dptr++;   /* read code either 0008 or 0000 */
  if (dsize < 8) /* NOP */
  { 
    dec_info->xs = dec_info->ys = dec_info->xe = dec_info->ye = 0;
    return(ACT_DLTA_NOP);
  }
  if (d & 0x0008) /* Header present */
  {
    y = (*dptr++) << 8; y |= *dptr++;           /* start line */
    dptr += 2;                                  /* unknown */
    lines = (*dptr++) << 8; lines |= *dptr++;   /* number of lines */
    dptr += 2;                                  /* unknown */
  }
  else { y = 0; lines = imagey; }
  x = 0; y--; lines++;
  while(lines)				/* loop thru lines */
  {
    xaULONG d,xskip,cnt;

    xskip = *dptr++;				/* skip x pixels */
    cnt = *dptr++;				/* RLE code */
    if (cnt == 0) break; 			/* exit */
    
/* this can be removed */
    if ((xskip == 0x80) && (cnt == 0x00))  /* end of codec */
    {
	  lines = 0; y++; x = 0; 
    }
    else if ((xskip == 0x80) && (cnt == 0xff)) /* skip line */
	{lines--; y++; x = 0; }
    else
    {
      if (xskip & 0x80) {lines--; y++; x = xskip & 0x7f;}
      else x += xskip;

      if (cnt < 0x80)				/* run of data */
      { 
        xaUBYTE *bptr; xaUSHORT *sptr; xaULONG *lptr;
	if ((x11_bytes_pixel==1) || (map_flag==xaFALSE) )
		bptr = (xaUBYTE *)(image + (y * imagex) + (x << 4) );
	else if (x11_bytes_pixel==2)
		sptr = (xaUSHORT *)(image + 2*(y * imagex) + (x << 5) );
        else lptr = (xaULONG *)(image + 4*(y * imagex) + (x << 6) );
        x += cnt;
        while(cnt--) 
        { xaULONG i,mask;
          d = (*dptr++ << 8); d |= *dptr++;
          mask = 0x8000;
          for(i=0;i<16;i++)
          {
            if (map_flag==xaFALSE) 
		{ if (d & mask) *bptr++ = 0;  else *bptr++ = 1; }
            else if (x11_bytes_pixel==1) {if (d & mask) *bptr++=(xaUBYTE)map[0];
					else *bptr++=(xaUBYTE)map[1];}
            else if (x11_bytes_pixel==2) {if (d & mask) *sptr++ =(xaUSHORT)map[0];
					else *sptr++ =(xaUSHORT)map[1]; }
            else { if (d & mask) *lptr++ = (xaULONG)map[0]; 
					else *lptr++ = (xaULONG)map[1]; }
            mask >>= 1;
          }
        }
      } /* end run */ 
      else				/* repeat data */
      { 
        xaUBYTE *bptr; xaUSHORT *sptr; xaULONG *lptr;
	if ((x11_bytes_pixel==1) || (map_flag==xaFALSE) )
		bptr = (xaUBYTE *)(image + (y * imagex) + (x << 4) );
	else if (x11_bytes_pixel==2)
		sptr = (xaUSHORT *)(image + 2*(y * imagex) + (x << 5) );
        else lptr = (xaULONG *)(image + 4*(y * imagex) + (x << 6) );
        cnt = 0x100 - cnt;
        x += cnt;
        d = (*dptr++ << 8); d |= *dptr++;
        while(cnt--) 
        { xaULONG i,mask;
          mask = 0x8000;
          for(i=0;i<16;i++)
          {
            if (map_flag==xaFALSE) 
		{ if (d & mask) *bptr++ = 0;  else *bptr++ = 1; }
            else if (x11_bytes_pixel==1) {if (d & mask) *bptr++=(xaUBYTE)map[0];
					else *bptr++=(xaUBYTE)map[1];}
            else if (x11_bytes_pixel==2) {if (d & mask) *sptr++ =(xaUSHORT)map[0];
					else *sptr++ =(xaUSHORT)map[1]; }
            else { if (d & mask) *lptr++ = (xaULONG)map[0]; 
					else *lptr++ = (xaULONG)map[1]; }
            mask >>= 1;
          }
        }
      } /* end repeat */
    } /* end of code */
  } /* end of lines */
 dec_info->xs = dec_info->ys = 0; dec_info->xe = imagex; dec_info->ye = imagey;
 if (map_flag==xaTRUE) return(ACT_DLTA_MAPD);
 else return(ACT_DLTA_NORM);
}

Attachments (2)

qt_rle_bw.mov (1.8 MB) - added by ami_stuff 6 years ago.
Animation-1bpp.mov (435.2 KB) - added by ami_stuff 6 years ago.

Change History (6)

Changed 6 years ago by ami_stuff

Changed 6 years ago by ami_stuff

comment:1 Changed 5 years ago by cehoyos

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

Looks reproducible.

comment:2 Changed 5 years ago by cehoyos

  • Keywords qtrle added

comment:3 Changed 5 years ago by cehoyos

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

Fixed by Alexis Ballier.

comment:4 Changed 4 years ago by cehoyos

  • Keywords roundup added
Note: See TracTickets for help on using tickets.