[FFmpeg-devel] [BUG] Theora decoder displays green line
Michael Niedermayer
michaelni
Mon May 7 12:34:06 CEST 2007
Hi
On Mon, May 07, 2007 at 02:40:06AM +0200, Aurelien Jacobs wrote:
> On Sun, 6 May 2007 19:51:34 +0200
> Michael Niedermayer <michaelni at gmx.at> wrote:
>
> > Hi
> >
> > On Sun, May 06, 2007 at 06:54:53PM +0200, Aurelien Jacobs wrote:
> > > On Sun, 6 May 2007 17:45:10 +0200
> > > Michael Niedermayer <michaelni at gmx.at> wrote:
> > >
> > > > On Sun, May 06, 2007 at 05:23:25PM +0200, Aurelien Jacobs wrote:
> > > > > On Sun, 6 May 2007 17:12:21 +0200
> > > > > Michael Niedermayer <michaelni at gmx.at> wrote:
> > > > >
> > > > > > Hi
> > > > > >
> > > > > > On Sun, May 06, 2007 at 02:26:36PM +0200, Diego Biurrun wrote:
> > > > > > > Try the following sample:
> > > > > > >
> > > > > > > http://mirrors.creativecommons.org/getcreative/Creative_Commons_-_Get_Creative.ogg
> > > > > > >
> > > > > > > ffplay displays a green line at the bottom (as does MPlayer with lavc
> > > > > > > decoder and lavf demuxer), while MPlayer with native demuxer and
> > > > > > > libtheora decoder works fine.
> > > > > >
> > > > > > ffmpeg -i output could be usefull
> > > > >
> > > > > coded size is 400x304, display size should be 400x300.
> > > > > Attached patch fixes this issue.
> > > > >
> > > > > Aurel
> > > >
> > > > > Index: libavcodec/vp3.c
> > > > > ===================================================================
> > > > > --- libavcodec/vp3.c (revision 8918)
> > > > > +++ libavcodec/vp3.c (working copy)
> > > > > @@ -1950,8 +1950,8 @@
> > > > > s->version = 1;
> > > > >
> > > > > s->avctx = avctx;
> > > > > - s->width = (avctx->width + 15) & 0xFFFFFFF0;
> > > > > - s->height = (avctx->height + 15) & 0xFFFFFFF0;
> > > > > + s->width = (avctx->coded_width + 15) & 0xFFFFFFF0;
> > > > > + s->height = (avctx->coded_height + 15) & 0xFFFFFFF0;
> > > > > avctx->pix_fmt = PIX_FMT_YUV420P;
> > > > > if(avctx->idct_algo==FF_IDCT_AUTO)
> > > > > avctx->idct_algo=FF_IDCT_VP3;
> > > > > @@ -2385,6 +2385,8 @@
> > > > >
> > > > > s->width = get_bits(gb, 16) << 4;
> > > > > s->height = get_bits(gb, 16) << 4;
> > > > > + avctx->width = get_bits_long(gb, 24);
> > > > > + avctx->height = get_bits_long(gb, 24);
> > > >
> > > > is there anything which ensures that the allocated buffer will
> > > > be large enough for the picture which gets decoded?
> > > >
> > > > also, avcodec_set_dimensions() should be used
> > > >
> > > >
> > > > [...]
> > > > > Index: libavformat/oggparsetheora.c
> > > > > ===================================================================
> > > > > --- libavformat/oggparsetheora.c (revision 8918)
> > > > > +++ libavformat/oggparsetheora.c (working copy)
> > > > > @@ -70,13 +70,15 @@
> > > > > return -1;
> > > > > }
> > > > >
> > > > > - st->codec->width = get_bits(&gb, 16) << 4;
> > > > > - st->codec->height = get_bits(&gb, 16) << 4;
> > > > > + st->codec->coded_width = get_bits(&gb, 16) << 4;
> > > > > + st->codec->coded_height = get_bits(&gb, 16) << 4;
> > > > > + st->codec->width = get_bits_long(&gb, 24);
> > > > > + st->codec->height = get_bits_long(&gb, 24);
> > > >
> > > > coded_width=width unless lowres or other decoder side tricks
> > > > are used
> > > >
> > > > the allocated buffer always has its w/h rounded up to the next multiple
> > > > of 16 with yv12
> > > > that is coded_width is not the allocated width (see avcodec_align_dimensions)
> > >
> > > Ok. It seems my usage of coded_width is wrong.
> > > Now what should be used when the displayed picture is smaller than the
> > > encoded picture ?
> >
> > normal codecs (not xiph codecs) have a width/height, use buffers with
> > rounded up width/height and can encode one or more display rectangles
> >
> > you could store the get_bits(&gb, 16) << 4 in width/height and use
> > pan_scan for the display width/height this would theoretically be correct
> > but as ffplay and others ignore pan_scan currently this would only be
> > half of a fix ...
>
> I gave a quick try to pan_scan. For now it's used in only one place:
> MpegEnc. Not any single decoder use it. Using it would imply significant
> modifications to ffplay, ffmpeg, vd_ffmpeg and every other apps using
> libavcodec. I admit that it's the proper and most versatil solution,
> but it's a huge work to implement.
> So instead I fixed it in a far simpler way using the nice property of avcodec_align_dimensions. See attached patch.
patch looks ok
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Observe your enemies, for they first find out your faults. -- Antisthenes
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20070507/86a7f994/attachment.pgp>
More information about the ffmpeg-devel
mailing list