[Ffmpeg-devel] Re: Broken decoding of mpeg2?

Joakim Plate elupus
Tue Mar 21 12:21:55 CET 2006


">> You are probably using some sort of direct rendering, it doesn't work 
with
>> some outputs in mplayer for example. mplayer reporting that lavc supports
>> aritrairy strides even thou mpeg12 decoder doesn't even support any 
>> change
>> in it.
>
> arbitrary != change
> to make a silly analogy, a car might support arbitrary tires but changing
> them while driving still would be tricky
>
> the buffers for direct rendering are the internal buffers used by ffmpeg
> theese have strict restrictions on alignment and unchanging stride, if
> the user app cant provide this then direct rendering should not be used
>
> [...]
> -- 
> Michael

Agreed, but my point is this.. mplayer overrides the default get_buffer 
function with it's own.

static int get_buffer(AVCodecContext *avctx, AVFrame *pic){
    sh_video_t * sh = avctx->opaque;
    vd_ffmpeg_ctx *ctx = sh->context;
    mp_image_t* mpi=NULL;
    int flags= MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE;
    int type= MP_IMGTYPE_IPB;
    int width= avctx->width;
    int height= avctx->height;
    int align=15;
...
...

the flag MP_IMGFLAG_ACCEPT_STRIDE is passed to the next filter or output, 
wich in for example the directx renderer means it can return an arbitrary 
stride and alignment (depends on pitch of the d3d texture it allocates). A 
few other renderers assume the same about that flag, just that normally they 
have buffers with same stride as width and thus normally works. Either the 
accept_stride flag should be removed from vd_ffmpeg.c in mplayer or ffmpeg 
should pass some hint that it can or can not accept a stride different from 
width and with a specific alignment.

/Joakim 







More information about the ffmpeg-devel mailing list