avviddec: Initialize strides with the ones of avcodec_default_get_buffer() if we ever call it

https://bugzilla.gnome.org/show_bug.cgi?id=704769
This commit is contained in:
Sebastian Dröge 2013-09-12 13:56:31 +02:00
parent 5c1ab55c5c
commit 677eaa6692
2 changed files with 14 additions and 4 deletions

View file

@ -617,6 +617,10 @@ gst_ffmpegviddec_get_buffer (AVCodecContext * context, AVFrame * picture)
if (ffmpegdec->stride[c] == -1) { if (ffmpegdec->stride[c] == -1) {
ffmpegdec->stride[c] = picture->linesize[c]; ffmpegdec->stride[c] = picture->linesize[c];
} else if (picture->linesize[c] != ffmpegdec->stride[c]) { } else if (picture->linesize[c] != ffmpegdec->stride[c]) {
GST_LOG_OBJECT (ffmpegdec,
"No direct rendering, stride changed c=%d %d->%d", c,
ffmpegdec->stride[c], picture->linesize[c]);
for (c = 0; c < AV_NUM_DATA_POINTERS; c++) { for (c = 0; c < AV_NUM_DATA_POINTERS; c++) {
picture->data[c] = NULL; picture->data[c] = NULL;
picture->linesize[c] = 0; picture->linesize[c] = 0;
@ -671,7 +675,13 @@ invalid_frame:
} }
fallback: fallback:
{ {
return avcodec_default_get_buffer (context, picture); int c;
int ret = avcodec_default_get_buffer (context, picture);
for (c = 0; c < AV_NUM_DATA_POINTERS; c++)
ffmpegdec->stride[c] = picture->linesize[c];
return ret;
} }
duplicate_frame: duplicate_frame:
{ {
@ -1570,8 +1580,8 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
avcodec_align_dimensions2 (ffmpegdec->context, &width, &height, avcodec_align_dimensions2 (ffmpegdec->context, &width, &height,
linesize_align); linesize_align);
edge = edge =
ffmpegdec-> ffmpegdec->context->
context->flags & CODEC_FLAG_EMU_EDGE ? 0 : avcodec_get_edge_width (); flags & CODEC_FLAG_EMU_EDGE ? 0 : avcodec_get_edge_width ();
/* increase the size for the padding */ /* increase the size for the padding */
width += edge << 1; width += edge << 1;
height += edge << 1; height += edge << 1;

View file

@ -37,7 +37,7 @@ struct _GstFFMpegVidDec
/* decoding */ /* decoding */
AVCodecContext *context; AVCodecContext *context;
AVFrame *picture; AVFrame *picture;
gint stride[4]; gint stride[AV_NUM_DATA_POINTERS];
gboolean opened; gboolean opened;
/* current context */ /* current context */