avviddec: Fix bufferpool config double free by taking a copy as needed
[platform/upstream/gstreamer.git] / ext / libav / gstavviddec.c
1 /* GStreamer
2  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include <assert.h>
25 #include <string.h>
26
27 #include <libavcodec/avcodec.h>
28
29 #include <gst/gst.h>
30 #include <gst/video/video.h>
31 #include <gst/video/gstvideodecoder.h>
32 #include <gst/video/gstvideometa.h>
33 #include <gst/video/gstvideopool.h>
34
35 #include "gstav.h"
36 #include "gstavcodecmap.h"
37 #include "gstavutils.h"
38 #include "gstavviddec.h"
39
40 GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE);
41
42 #define MAX_TS_MASK 0xff
43
44 #define DEFAULT_LOWRES                  0
45 #define DEFAULT_SKIPFRAME               0
46 #define DEFAULT_DIRECT_RENDERING        TRUE
47 #define DEFAULT_DEBUG_MV                FALSE
48 #define DEFAULT_MAX_THREADS             0
49 #define DEFAULT_OUTPUT_CORRUPT          TRUE
50 #define REQUIRED_POOL_MAX_BUFFERS       32
51 #define DEFAULT_STRIDE_ALIGN            31
52 #define DEFAULT_ALLOC_PARAM             { 0, DEFAULT_STRIDE_ALIGN, 0, 0, }
53
54 enum
55 {
56   PROP_0,
57   PROP_LOWRES,
58   PROP_SKIPFRAME,
59   PROP_DIRECT_RENDERING,
60   PROP_DEBUG_MV,
61   PROP_MAX_THREADS,
62   PROP_OUTPUT_CORRUPT,
63   PROP_LAST
64 };
65
66 /* A number of function prototypes are given so we can refer to them later. */
67 static void gst_ffmpegviddec_base_init (GstFFMpegVidDecClass * klass);
68 static void gst_ffmpegviddec_class_init (GstFFMpegVidDecClass * klass);
69 static void gst_ffmpegviddec_init (GstFFMpegVidDec * ffmpegdec);
70 static void gst_ffmpegviddec_finalize (GObject * object);
71
72 static gboolean gst_ffmpegviddec_set_format (GstVideoDecoder * decoder,
73     GstVideoCodecState * state);
74 static GstFlowReturn gst_ffmpegviddec_handle_frame (GstVideoDecoder * decoder,
75     GstVideoCodecFrame * frame);
76 static gboolean gst_ffmpegviddec_start (GstVideoDecoder * decoder);
77 static gboolean gst_ffmpegviddec_stop (GstVideoDecoder * decoder);
78 static gboolean gst_ffmpegviddec_flush (GstVideoDecoder * decoder);
79 static gboolean gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder,
80     GstQuery * query);
81 static gboolean gst_ffmpegviddec_propose_allocation (GstVideoDecoder * decoder,
82     GstQuery * query);
83
84 static void gst_ffmpegviddec_set_property (GObject * object,
85     guint prop_id, const GValue * value, GParamSpec * pspec);
86 static void gst_ffmpegviddec_get_property (GObject * object,
87     guint prop_id, GValue * value, GParamSpec * pspec);
88
89 static gboolean gst_ffmpegviddec_negotiate (GstFFMpegVidDec * ffmpegdec,
90     AVCodecContext * context, AVFrame * picture);
91
92 /* some sort of bufferpool handling, but different */
93 static int gst_ffmpegviddec_get_buffer2 (AVCodecContext * context,
94     AVFrame * picture, int flags);
95
96 static GstFlowReturn gst_ffmpegviddec_finish (GstVideoDecoder * decoder);
97 static void gst_ffmpegviddec_drain (GstFFMpegVidDec * ffmpegdec);
98
99 static gboolean picture_changed (GstFFMpegVidDec * ffmpegdec,
100     AVFrame * picture);
101 static gboolean context_changed (GstFFMpegVidDec * ffmpegdec,
102     AVCodecContext * context);
103
104 #define GST_FFDEC_PARAMS_QDATA g_quark_from_static_string("avdec-params")
105
106 static GstElementClass *parent_class = NULL;
107
108 #define GST_FFMPEGVIDDEC_TYPE_LOWRES (gst_ffmpegviddec_lowres_get_type())
109 static GType
110 gst_ffmpegviddec_lowres_get_type (void)
111 {
112   static GType ffmpegdec_lowres_type = 0;
113
114   if (!ffmpegdec_lowres_type) {
115     static const GEnumValue ffmpegdec_lowres[] = {
116       {0, "0", "full"},
117       {1, "1", "1/2-size"},
118       {2, "2", "1/4-size"},
119       {0, NULL, NULL},
120     };
121
122     ffmpegdec_lowres_type =
123         g_enum_register_static ("GstLibAVVidDecLowres", ffmpegdec_lowres);
124   }
125
126   return ffmpegdec_lowres_type;
127 }
128
129 #define GST_FFMPEGVIDDEC_TYPE_SKIPFRAME (gst_ffmpegviddec_skipframe_get_type())
130 static GType
131 gst_ffmpegviddec_skipframe_get_type (void)
132 {
133   static GType ffmpegdec_skipframe_type = 0;
134
135   if (!ffmpegdec_skipframe_type) {
136     static const GEnumValue ffmpegdec_skipframe[] = {
137       {0, "0", "Skip nothing"},
138       {1, "1", "Skip B-frames"},
139       {2, "2", "Skip IDCT/Dequantization"},
140       {5, "5", "Skip everything"},
141       {0, NULL, NULL},
142     };
143
144     ffmpegdec_skipframe_type =
145         g_enum_register_static ("GstLibAVVidDecSkipFrame", ffmpegdec_skipframe);
146   }
147
148   return ffmpegdec_skipframe_type;
149 }
150
151 static void
152 gst_ffmpegviddec_base_init (GstFFMpegVidDecClass * klass)
153 {
154   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
155   GstPadTemplate *sinktempl, *srctempl;
156   GstCaps *sinkcaps, *srccaps;
157   AVCodec *in_plugin;
158   gchar *longname, *description;
159
160   in_plugin =
161       (AVCodec *) g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass),
162       GST_FFDEC_PARAMS_QDATA);
163   g_assert (in_plugin != NULL);
164
165   /* construct the element details struct */
166   longname = g_strdup_printf ("libav %s decoder", in_plugin->long_name);
167   description = g_strdup_printf ("libav %s decoder", in_plugin->name);
168   gst_element_class_set_metadata (element_class, longname,
169       "Codec/Decoder/Video", description,
170       "Wim Taymans <wim.taymans@gmail.com>, "
171       "Ronald Bultje <rbultje@ronald.bitfreak.net>, "
172       "Edward Hervey <bilboed@bilboed.com>");
173   g_free (longname);
174   g_free (description);
175
176   /* get the caps */
177   sinkcaps = gst_ffmpeg_codecid_to_caps (in_plugin->id, NULL, FALSE);
178   if (!sinkcaps) {
179     GST_DEBUG ("Couldn't get sink caps for decoder '%s'", in_plugin->name);
180     sinkcaps = gst_caps_new_empty_simple ("unknown/unknown");
181   }
182   srccaps = gst_ffmpeg_codectype_to_video_caps (NULL,
183       in_plugin->id, FALSE, in_plugin);
184   if (!srccaps) {
185     GST_DEBUG ("Couldn't get source caps for decoder '%s'", in_plugin->name);
186     srccaps = gst_caps_from_string ("video/x-raw");
187   }
188
189   /* pad templates */
190   sinktempl = gst_pad_template_new ("sink", GST_PAD_SINK,
191       GST_PAD_ALWAYS, sinkcaps);
192   srctempl = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, srccaps);
193
194   gst_element_class_add_pad_template (element_class, srctempl);
195   gst_element_class_add_pad_template (element_class, sinktempl);
196
197   klass->in_plugin = in_plugin;
198 }
199
200 static void
201 gst_ffmpegviddec_class_init (GstFFMpegVidDecClass * klass)
202 {
203   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
204   GstVideoDecoderClass *viddec_class = GST_VIDEO_DECODER_CLASS (klass);
205   int caps;
206
207   parent_class = g_type_class_peek_parent (klass);
208
209   gobject_class->finalize = gst_ffmpegviddec_finalize;
210
211   gobject_class->set_property = gst_ffmpegviddec_set_property;
212   gobject_class->get_property = gst_ffmpegviddec_get_property;
213
214   g_object_class_install_property (gobject_class, PROP_SKIPFRAME,
215       g_param_spec_enum ("skip-frame", "Skip frames",
216           "Which types of frames to skip during decoding",
217           GST_FFMPEGVIDDEC_TYPE_SKIPFRAME, 0,
218           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
219   g_object_class_install_property (gobject_class, PROP_LOWRES,
220       g_param_spec_enum ("lowres", "Low resolution",
221           "At which resolution to decode images",
222           GST_FFMPEGVIDDEC_TYPE_LOWRES, 0,
223           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
224   g_object_class_install_property (gobject_class, PROP_DIRECT_RENDERING,
225       g_param_spec_boolean ("direct-rendering", "Direct Rendering",
226           "Enable direct rendering", DEFAULT_DIRECT_RENDERING,
227           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
228   g_object_class_install_property (gobject_class, PROP_DEBUG_MV,
229       g_param_spec_boolean ("debug-mv", "Debug motion vectors",
230           "Whether libav should print motion vectors on top of the image",
231           DEFAULT_DEBUG_MV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
232   g_object_class_install_property (gobject_class, PROP_OUTPUT_CORRUPT,
233       g_param_spec_boolean ("output-corrupt", "Output corrupt buffers",
234           "Whether libav should output frames even if corrupted",
235           DEFAULT_OUTPUT_CORRUPT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
236
237   caps = klass->in_plugin->capabilities;
238   if (caps & (CODEC_CAP_FRAME_THREADS | CODEC_CAP_SLICE_THREADS)) {
239     g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_THREADS,
240         g_param_spec_int ("max-threads", "Maximum decode threads",
241             "Maximum number of worker threads to spawn. (0 = auto)",
242             0, G_MAXINT, DEFAULT_MAX_THREADS,
243             G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
244   }
245
246   viddec_class->set_format = gst_ffmpegviddec_set_format;
247   viddec_class->handle_frame = gst_ffmpegviddec_handle_frame;
248   viddec_class->start = gst_ffmpegviddec_start;
249   viddec_class->stop = gst_ffmpegviddec_stop;
250   viddec_class->flush = gst_ffmpegviddec_flush;
251   viddec_class->finish = gst_ffmpegviddec_finish;
252   viddec_class->drain = gst_ffmpegviddec_finish;        /* drain and finish are the same to us */
253   viddec_class->decide_allocation = gst_ffmpegviddec_decide_allocation;
254   viddec_class->propose_allocation = gst_ffmpegviddec_propose_allocation;
255 }
256
257 static void
258 gst_ffmpegviddec_init (GstFFMpegVidDec * ffmpegdec)
259 {
260   GstFFMpegVidDecClass *klass =
261       (GstFFMpegVidDecClass *) G_OBJECT_GET_CLASS (ffmpegdec);
262
263   /* some ffmpeg data */
264   ffmpegdec->context = avcodec_alloc_context3 (klass->in_plugin);
265   ffmpegdec->context->opaque = ffmpegdec;
266   ffmpegdec->picture = av_frame_alloc ();
267   ffmpegdec->opened = FALSE;
268   ffmpegdec->skip_frame = ffmpegdec->lowres = 0;
269   ffmpegdec->direct_rendering = DEFAULT_DIRECT_RENDERING;
270   ffmpegdec->debug_mv = DEFAULT_DEBUG_MV;
271   ffmpegdec->max_threads = DEFAULT_MAX_THREADS;
272   ffmpegdec->output_corrupt = DEFAULT_OUTPUT_CORRUPT;
273
274   GST_PAD_SET_ACCEPT_TEMPLATE (GST_VIDEO_DECODER_SINK_PAD (ffmpegdec));
275   gst_video_decoder_set_use_default_pad_acceptcaps (GST_VIDEO_DECODER_CAST
276       (ffmpegdec), TRUE);
277
278   gst_video_decoder_set_needs_format (GST_VIDEO_DECODER (ffmpegdec), TRUE);
279 }
280
281 static void
282 gst_ffmpegviddec_finalize (GObject * object)
283 {
284   GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) object;
285
286   av_frame_free (&ffmpegdec->picture);
287
288   if (ffmpegdec->context != NULL) {
289     gst_ffmpeg_avcodec_close (ffmpegdec->context);
290     av_free (ffmpegdec->context);
291     ffmpegdec->context = NULL;
292   }
293
294   G_OBJECT_CLASS (parent_class)->finalize (object);
295 }
296
297 static void
298 gst_ffmpegviddec_context_set_flags (AVCodecContext * context, guint flags,
299     gboolean enable)
300 {
301   g_return_if_fail (context != NULL);
302
303   if (enable)
304     context->flags |= flags;
305   else
306     context->flags &= ~flags;
307 }
308
309 /* with LOCK */
310 static gboolean
311 gst_ffmpegviddec_close (GstFFMpegVidDec * ffmpegdec, gboolean reset)
312 {
313   GstFFMpegVidDecClass *oclass;
314   gint i;
315
316   oclass = (GstFFMpegVidDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec));
317
318   GST_LOG_OBJECT (ffmpegdec, "closing ffmpeg codec");
319
320   gst_caps_replace (&ffmpegdec->last_caps, NULL);
321
322   gst_ffmpeg_avcodec_close (ffmpegdec->context);
323   ffmpegdec->opened = FALSE;
324
325   for (i = 0; i < G_N_ELEMENTS (ffmpegdec->stride); i++)
326     ffmpegdec->stride[i] = -1;
327
328   gst_buffer_replace (&ffmpegdec->palette, NULL);
329
330   if (ffmpegdec->context->extradata) {
331     av_free (ffmpegdec->context->extradata);
332     ffmpegdec->context->extradata = NULL;
333   }
334   if (ffmpegdec->context->slice_offset) {
335     g_free (ffmpegdec->context->slice_offset);
336     ffmpegdec->context->slice_offset = NULL;
337   }
338   if (reset) {
339     if (avcodec_get_context_defaults3 (ffmpegdec->context,
340             oclass->in_plugin) < 0) {
341       GST_DEBUG_OBJECT (ffmpegdec, "Failed to set context defaults");
342       return FALSE;
343     }
344     ffmpegdec->context->opaque = ffmpegdec;
345   }
346   return TRUE;
347 }
348
349 /* with LOCK */
350 static gboolean
351 gst_ffmpegviddec_open (GstFFMpegVidDec * ffmpegdec)
352 {
353   GstFFMpegVidDecClass *oclass;
354   gint i;
355
356   oclass = (GstFFMpegVidDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec));
357
358   if (gst_ffmpeg_avcodec_open (ffmpegdec->context, oclass->in_plugin) < 0)
359     goto could_not_open;
360
361   for (i = 0; i < G_N_ELEMENTS (ffmpegdec->stride); i++)
362     ffmpegdec->stride[i] = -1;
363
364   ffmpegdec->opened = TRUE;
365   ffmpegdec->is_realvideo = FALSE;
366
367   GST_LOG_OBJECT (ffmpegdec, "Opened libav codec %s, id %d",
368       oclass->in_plugin->name, oclass->in_plugin->id);
369
370   switch (oclass->in_plugin->id) {
371     case AV_CODEC_ID_RV10:
372     case AV_CODEC_ID_RV30:
373     case AV_CODEC_ID_RV20:
374     case AV_CODEC_ID_RV40:
375       ffmpegdec->is_realvideo = TRUE;
376       break;
377     default:
378       GST_LOG_OBJECT (ffmpegdec, "Parser deactivated for format");
379       break;
380   }
381
382   gst_ffmpegviddec_context_set_flags (ffmpegdec->context,
383       CODEC_FLAG_OUTPUT_CORRUPT, ffmpegdec->output_corrupt);
384
385   return TRUE;
386
387   /* ERRORS */
388 could_not_open:
389   {
390     gst_ffmpegviddec_close (ffmpegdec, TRUE);
391     GST_DEBUG_OBJECT (ffmpegdec, "avdec_%s: Failed to open libav codec",
392         oclass->in_plugin->name);
393     return FALSE;
394   }
395 }
396
397 static void
398 gst_ffmpegviddec_get_palette (GstFFMpegVidDec * ffmpegdec,
399     GstVideoCodecState * state)
400 {
401   GstStructure *str = gst_caps_get_structure (state->caps, 0);
402   const GValue *palette_v;
403   GstBuffer *palette;
404
405   /* do we have a palette? */
406   if ((palette_v = gst_structure_get_value (str, "palette_data"))) {
407     palette = gst_value_get_buffer (palette_v);
408     GST_DEBUG ("got palette data %p", palette);
409     if (gst_buffer_get_size (palette) >= AVPALETTE_SIZE) {
410       gst_buffer_replace (&ffmpegdec->palette, palette);
411     }
412   }
413 }
414
415
416 static gboolean
417 gst_ffmpegviddec_set_format (GstVideoDecoder * decoder,
418     GstVideoCodecState * state)
419 {
420   GstFFMpegVidDec *ffmpegdec;
421   GstFFMpegVidDecClass *oclass;
422   GstClockTime latency = GST_CLOCK_TIME_NONE;
423   gboolean ret = FALSE;
424
425   ffmpegdec = (GstFFMpegVidDec *) decoder;
426   oclass = (GstFFMpegVidDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec));
427
428   if (ffmpegdec->last_caps != NULL &&
429       gst_caps_is_equal (ffmpegdec->last_caps, state->caps)) {
430     return TRUE;
431   }
432
433   GST_DEBUG_OBJECT (ffmpegdec, "setcaps called");
434
435   GST_OBJECT_LOCK (ffmpegdec);
436   /* stupid check for VC1 */
437   if ((oclass->in_plugin->id == AV_CODEC_ID_WMV3) ||
438       (oclass->in_plugin->id == AV_CODEC_ID_VC1))
439     oclass->in_plugin->id = gst_ffmpeg_caps_to_codecid (state->caps, NULL);
440
441   /* close old session */
442   if (ffmpegdec->opened) {
443     GST_OBJECT_UNLOCK (ffmpegdec);
444     gst_ffmpegviddec_drain (ffmpegdec);
445     GST_OBJECT_LOCK (ffmpegdec);
446     if (!gst_ffmpegviddec_close (ffmpegdec, TRUE)) {
447       GST_OBJECT_UNLOCK (ffmpegdec);
448       return FALSE;
449     }
450     ffmpegdec->pic_pix_fmt = 0;
451     ffmpegdec->pic_width = 0;
452     ffmpegdec->pic_height = 0;
453     ffmpegdec->pic_par_n = 0;
454     ffmpegdec->pic_par_d = 0;
455     ffmpegdec->ctx_ticks = 0;
456     ffmpegdec->ctx_time_n = 0;
457     ffmpegdec->ctx_time_d = 0;
458   }
459
460   gst_caps_replace (&ffmpegdec->last_caps, state->caps);
461
462   /* set buffer functions */
463   ffmpegdec->context->get_buffer2 = gst_ffmpegviddec_get_buffer2;
464   ffmpegdec->context->get_buffer = NULL;
465   ffmpegdec->context->reget_buffer = NULL;
466   ffmpegdec->context->release_buffer = NULL;
467   ffmpegdec->context->draw_horiz_band = NULL;
468
469   /* reset coded_width/_height to prevent it being reused from last time when
470    * the codec is opened again, causing a mismatch and possible
471    * segfault/corruption. (Common scenario when renegotiating caps) */
472   ffmpegdec->context->coded_width = 0;
473   ffmpegdec->context->coded_height = 0;
474
475   GST_LOG_OBJECT (ffmpegdec, "size %dx%d", ffmpegdec->context->width,
476       ffmpegdec->context->height);
477
478   /* FIXME : Create a method that takes GstVideoCodecState instead */
479   /* get size and so */
480   gst_ffmpeg_caps_with_codecid (oclass->in_plugin->id,
481       oclass->in_plugin->type, state->caps, ffmpegdec->context);
482
483   GST_LOG_OBJECT (ffmpegdec, "size after %dx%d", ffmpegdec->context->width,
484       ffmpegdec->context->height);
485
486   gst_ffmpegviddec_get_palette (ffmpegdec, state);
487
488   if (!ffmpegdec->context->time_base.den || !ffmpegdec->context->time_base.num) {
489     GST_DEBUG_OBJECT (ffmpegdec, "forcing 25/1 framerate");
490     ffmpegdec->context->time_base.num = 1;
491     ffmpegdec->context->time_base.den = 25;
492   }
493
494   /* workaround encoder bugs */
495   ffmpegdec->context->workaround_bugs |= FF_BUG_AUTODETECT;
496   ffmpegdec->context->err_recognition = 1;
497
498   /* for slow cpus */
499   ffmpegdec->context->lowres = ffmpegdec->lowres;
500   ffmpegdec->context->skip_frame = ffmpegdec->skip_frame;
501
502   /* ffmpeg can draw motion vectors on top of the image (not every decoder
503    * supports it) */
504   ffmpegdec->context->debug_mv = ffmpegdec->debug_mv;
505
506   {
507     GstQuery *query;
508     gboolean is_live;
509
510     if (ffmpegdec->max_threads == 0) {
511       if (!(oclass->in_plugin->capabilities & CODEC_CAP_AUTO_THREADS))
512         ffmpegdec->context->thread_count = gst_ffmpeg_auto_max_threads ();
513       else
514         ffmpegdec->context->thread_count = 0;
515     } else
516       ffmpegdec->context->thread_count = ffmpegdec->max_threads;
517
518     query = gst_query_new_latency ();
519     is_live = FALSE;
520     /* Check if upstream is live. If it isn't we can enable frame based
521      * threading, which is adding latency */
522     if (gst_pad_peer_query (GST_VIDEO_DECODER_SINK_PAD (ffmpegdec), query)) {
523       gst_query_parse_latency (query, &is_live, NULL, NULL);
524     }
525     gst_query_unref (query);
526
527     if (is_live)
528       ffmpegdec->context->thread_type = FF_THREAD_SLICE;
529     else
530       ffmpegdec->context->thread_type = FF_THREAD_SLICE | FF_THREAD_FRAME;
531   }
532
533   /* open codec - we don't select an output pix_fmt yet,
534    * simply because we don't know! We only get it
535    * during playback... */
536   if (!gst_ffmpegviddec_open (ffmpegdec))
537     goto open_failed;
538
539   if (ffmpegdec->input_state)
540     gst_video_codec_state_unref (ffmpegdec->input_state);
541   ffmpegdec->input_state = gst_video_codec_state_ref (state);
542
543   if (ffmpegdec->input_state->info.fps_n) {
544     GstVideoInfo *info = &ffmpegdec->input_state->info;
545     latency = gst_util_uint64_scale_ceil (
546         (ffmpegdec->context->has_b_frames) * GST_SECOND, info->fps_d,
547         info->fps_n);
548   }
549
550   ret = TRUE;
551
552 done:
553   GST_OBJECT_UNLOCK (ffmpegdec);
554
555   if (GST_CLOCK_TIME_IS_VALID (latency))
556     gst_video_decoder_set_latency (decoder, latency, latency);
557
558   return ret;
559
560   /* ERRORS */
561 open_failed:
562   {
563     GST_DEBUG_OBJECT (ffmpegdec, "Failed to open");
564     goto done;
565   }
566 }
567
568 typedef struct
569 {
570   GstFFMpegVidDec *ffmpegdec;
571   GstVideoCodecFrame *frame;
572   gboolean mapped;
573   GstVideoFrame vframe;
574   GstBuffer *buffer;
575   AVBufferRef *avbuffer;
576 } GstFFMpegVidDecVideoFrame;
577
578 static GstFFMpegVidDecVideoFrame *
579 gst_ffmpegviddec_video_frame_new (GstFFMpegVidDec * ffmpegdec,
580     GstVideoCodecFrame * frame)
581 {
582   GstFFMpegVidDecVideoFrame *dframe;
583
584   dframe = g_slice_new0 (GstFFMpegVidDecVideoFrame);
585   dframe->ffmpegdec = ffmpegdec;
586   dframe->frame = frame;
587
588   GST_DEBUG_OBJECT (ffmpegdec, "new video frame %p", dframe);
589
590   return dframe;
591 }
592
593 static void
594 gst_ffmpegviddec_video_frame_free (GstFFMpegVidDec * ffmpegdec,
595     GstFFMpegVidDecVideoFrame * frame)
596 {
597   GST_DEBUG_OBJECT (ffmpegdec, "free video frame %p", frame);
598
599   if (frame->mapped)
600     gst_video_frame_unmap (&frame->vframe);
601   gst_video_decoder_release_frame (GST_VIDEO_DECODER (ffmpegdec), frame->frame);
602   gst_buffer_replace (&frame->buffer, NULL);
603   if (frame->avbuffer) {
604     av_buffer_unref (&frame->avbuffer);
605   }
606   g_slice_free (GstFFMpegVidDecVideoFrame, frame);
607 }
608
609 static void
610 dummy_free_buffer (void *opaque, uint8_t * data)
611 {
612   GstFFMpegVidDecVideoFrame *frame = opaque;
613
614   gst_ffmpegviddec_video_frame_free (frame->ffmpegdec, frame);
615 }
616
617 /* This function prepares the pool configuration for direct rendering. To use
618  * this method, the codec should support direct rendering and the pool should
619  * support video meta and video alignment */
620 static void
621 gst_ffmpegvideodec_prepare_dr_pool (GstFFMpegVidDec * ffmpegdec,
622     GstBufferPool * pool, GstVideoInfo * info, GstStructure * config)
623 {
624   GstAllocationParams params;
625   GstVideoAlignment align;
626   GstAllocator *allocator = NULL;
627   gint width, height;
628   gint linesize_align[4];
629   gint i;
630   guint edge;
631   gsize max_align;
632
633   width = GST_VIDEO_INFO_WIDTH (info);
634   height = GST_VIDEO_INFO_HEIGHT (info);
635
636   /* let ffmpeg find the alignment and padding */
637   avcodec_align_dimensions2 (ffmpegdec->context, &width, &height,
638       linesize_align);
639
640   if (ffmpegdec->context->flags & CODEC_FLAG_EMU_EDGE)
641     edge = 0;
642   else
643     edge = avcodec_get_edge_width ();
644
645   /* increase the size for the padding */
646   width += edge << 1;
647   height += edge << 1;
648
649   align.padding_top = edge;
650   align.padding_left = edge;
651   align.padding_right = width - GST_VIDEO_INFO_WIDTH (info) - edge;
652   align.padding_bottom = height - GST_VIDEO_INFO_HEIGHT (info) - edge;
653
654   /* add extra padding to match libav buffer allocation sizes */
655   align.padding_bottom++;
656
657   gst_buffer_pool_config_get_allocator (config, &allocator, &params);
658
659   max_align = DEFAULT_STRIDE_ALIGN;
660   max_align |= params.align;
661
662   for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
663     if (linesize_align[i] > 0)
664       max_align |= linesize_align[i] - 1;
665   }
666
667   for (i = 0; i < GST_VIDEO_MAX_PLANES; i++)
668     align.stride_align[i] = max_align;
669
670   params.align = max_align;
671
672   gst_buffer_pool_config_set_allocator (config, allocator, &params);
673
674   GST_DEBUG_OBJECT (ffmpegdec, "aligned dimension %dx%d -> %dx%d "
675       "padding t:%u l:%u r:%u b:%u, stride_align %d:%d:%d:%d",
676       GST_VIDEO_INFO_WIDTH (info),
677       GST_VIDEO_INFO_HEIGHT (info), width, height, align.padding_top,
678       align.padding_left, align.padding_right, align.padding_bottom,
679       align.stride_align[0], align.stride_align[1], align.stride_align[2],
680       align.stride_align[3]);
681
682   gst_buffer_pool_config_add_option (config,
683       GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT);
684   gst_buffer_pool_config_set_video_alignment (config, &align);
685 }
686
687 static void
688 gst_ffmpegviddec_ensure_internal_pool (GstFFMpegVidDec * ffmpegdec,
689     AVFrame * picture)
690 {
691   GstAllocationParams params = DEFAULT_ALLOC_PARAM;
692   GstVideoInfo info;
693   GstVideoFormat format;
694   GstCaps *caps;
695   GstStructure *config;
696   gint i;
697
698   if (ffmpegdec->internal_pool != NULL &&
699       ffmpegdec->pool_width == picture->width &&
700       ffmpegdec->pool_height == picture->height &&
701       ffmpegdec->pool_format == picture->format)
702     return;
703
704   GST_DEBUG_OBJECT (ffmpegdec, "Updating internal pool (%i, %i)",
705       picture->width, picture->height);
706
707   format = gst_ffmpeg_pixfmt_to_videoformat (picture->format);
708   gst_video_info_set_format (&info, format, picture->width, picture->height);
709
710   for (i = 0; i < G_N_ELEMENTS (ffmpegdec->stride); i++)
711     ffmpegdec->stride[i] = -1;
712
713   if (ffmpegdec->internal_pool)
714     gst_object_unref (ffmpegdec->internal_pool);
715
716   ffmpegdec->internal_pool = gst_video_buffer_pool_new ();
717   config = gst_buffer_pool_get_config (ffmpegdec->internal_pool);
718
719   caps = gst_video_info_to_caps (&info);
720   gst_buffer_pool_config_set_params (config, caps, info.size, 2, 0);
721   gst_buffer_pool_config_set_allocator (config, NULL, &params);
722   gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
723
724   gst_ffmpegvideodec_prepare_dr_pool (ffmpegdec,
725       ffmpegdec->internal_pool, &info, config);
726   /* generic video pool never fails */
727   gst_buffer_pool_set_config (ffmpegdec->internal_pool, config);
728   gst_caps_unref (caps);
729
730   gst_buffer_pool_set_active (ffmpegdec->internal_pool, TRUE);
731
732   /* Remember pool size so we can detect changes */
733   ffmpegdec->pool_width = picture->width;
734   ffmpegdec->pool_height = picture->height;
735   ffmpegdec->pool_format = picture->format;
736   ffmpegdec->pool_info = info;
737 }
738
739 static gboolean
740 gst_ffmpegviddec_can_direct_render (GstFFMpegVidDec * ffmpegdec)
741 {
742   GstFFMpegVidDecClass *oclass;
743
744   if (!ffmpegdec->direct_rendering)
745     return FALSE;
746
747   oclass = (GstFFMpegVidDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec));
748   return ((oclass->in_plugin->capabilities & CODEC_CAP_DR1) == CODEC_CAP_DR1);
749 }
750
751 /* called when ffmpeg wants us to allocate a buffer to write the decoded frame
752  * into. We try to give it memory from our pool */
753 static int
754 gst_ffmpegviddec_get_buffer2 (AVCodecContext * context, AVFrame * picture,
755     int flags)
756 {
757   GstVideoCodecFrame *frame;
758   GstFFMpegVidDecVideoFrame *dframe;
759   GstFFMpegVidDec *ffmpegdec;
760   gint c;
761   GstFlowReturn ret;
762
763   ffmpegdec = (GstFFMpegVidDec *) context->opaque;
764
765   GST_DEBUG_OBJECT (ffmpegdec, "getting buffer picture %p", picture);
766
767   /* apply the last info we have seen to this picture, when we get the
768    * picture back from ffmpeg we can use this to correctly timestamp the output
769    * buffer */
770   GST_DEBUG_OBJECT (ffmpegdec, "opaque value SN %d",
771       (gint32) picture->reordered_opaque);
772
773   frame =
774       gst_video_decoder_get_frame (GST_VIDEO_DECODER (ffmpegdec),
775       picture->reordered_opaque);
776   if (G_UNLIKELY (frame == NULL))
777     goto no_frame;
778
779   /* now it has a buffer allocated, so it is real and will also
780    * be _released */
781   GST_VIDEO_CODEC_FRAME_FLAG_UNSET (frame,
782       GST_VIDEO_CODEC_FRAME_FLAG_DECODE_ONLY);
783
784   if (G_UNLIKELY (frame->output_buffer != NULL))
785     goto duplicate_frame;
786
787   /* GstFFMpegVidDecVideoFrame receives the frame ref */
788   if (picture->opaque) {
789     dframe = picture->opaque;
790     dframe->frame = frame;
791   } else {
792     picture->opaque = dframe =
793         gst_ffmpegviddec_video_frame_new (ffmpegdec, frame);
794   }
795
796   GST_DEBUG_OBJECT (ffmpegdec, "storing opaque %p", dframe);
797
798   if (!gst_ffmpegviddec_can_direct_render (ffmpegdec))
799     goto no_dr;
800
801   gst_ffmpegviddec_ensure_internal_pool (ffmpegdec, picture);
802
803   ret = gst_buffer_pool_acquire_buffer (ffmpegdec->internal_pool,
804       &frame->output_buffer, NULL);
805   if (ret != GST_FLOW_OK)
806     goto alloc_failed;
807
808   /* piggy-backed alloc'ed on the frame,
809    * and there was much rejoicing and we are grateful.
810    * Now take away buffer from frame, we will give it back later when decoded.
811    * This allows multiple request for a buffer per frame; unusual but possible. */
812   gst_buffer_replace (&dframe->buffer, frame->output_buffer);
813   gst_buffer_replace (&frame->output_buffer, NULL);
814
815   /* Fill avpicture */
816   if (!gst_video_frame_map (&dframe->vframe, &ffmpegdec->pool_info,
817           dframe->buffer, GST_MAP_READWRITE))
818     goto invalid_frame;
819   dframe->mapped = TRUE;
820
821   for (c = 0; c < AV_NUM_DATA_POINTERS; c++) {
822     if (c < GST_VIDEO_INFO_N_PLANES (&ffmpegdec->pool_info)) {
823       picture->data[c] = GST_VIDEO_FRAME_PLANE_DATA (&dframe->vframe, c);
824       picture->linesize[c] = GST_VIDEO_FRAME_PLANE_STRIDE (&dframe->vframe, c);
825
826       if (ffmpegdec->stride[c] == -1)
827         ffmpegdec->stride[c] = picture->linesize[c];
828
829       /* libav does not allow stride changes, decide allocation should check
830        * before replacing the internal pool with a downstream pool.
831        * https://bugzilla.gnome.org/show_bug.cgi?id=704769
832        * https://bugzilla.libav.org/show_bug.cgi?id=556
833        */
834       g_assert (picture->linesize[c] == ffmpegdec->stride[c]);
835     } else {
836       picture->data[c] = NULL;
837       picture->linesize[c] = 0;
838     }
839     GST_LOG_OBJECT (ffmpegdec, "linesize %d, data %p", picture->linesize[c],
840         picture->data[c]);
841   }
842
843   picture->buf[0] = av_buffer_create (NULL, 0, dummy_free_buffer, dframe, 0);
844
845   /* tell ffmpeg we own this buffer, transfer the ref we have on the buffer to
846    * the opaque data. */
847   picture->type = FF_BUFFER_TYPE_USER;
848
849   GST_LOG_OBJECT (ffmpegdec, "returned frame %p", dframe->buffer);
850
851   return 0;
852
853   /* fallbacks */
854 no_dr:
855   {
856     GST_LOG_OBJECT (ffmpegdec, "direct rendering disabled, fallback alloc");
857     goto fallback;
858   }
859 alloc_failed:
860   {
861     /* alloc default buffer when we can't get one from downstream */
862     GST_LOG_OBJECT (ffmpegdec, "alloc failed, fallback alloc");
863     goto fallback;
864   }
865 invalid_frame:
866   {
867     /* alloc default buffer when we can't get one from downstream */
868     GST_LOG_OBJECT (ffmpegdec, "failed to map frame, fallback alloc");
869     gst_buffer_replace (&dframe->buffer, NULL);
870     goto fallback;
871   }
872 fallback:
873   {
874     int c;
875     int ret = avcodec_default_get_buffer2 (context, picture, flags);
876
877     for (c = 0; c < AV_NUM_DATA_POINTERS; c++) {
878       ffmpegdec->stride[c] = picture->linesize[c];
879     }
880     /* Wrap our buffer around the default one to be able to have a callback
881      * when our data can be freed. Just putting our data into the first free
882      * buffer might not work if there are too many allocated already
883      */
884     if (picture->buf[0]) {
885       dframe->avbuffer = picture->buf[0];
886       picture->buf[0] =
887           av_buffer_create (picture->buf[0]->data, picture->buf[0]->size,
888           dummy_free_buffer, dframe, 0);
889     } else {
890       picture->buf[0] =
891           av_buffer_create (NULL, 0, dummy_free_buffer, dframe, 0);
892     }
893
894     return ret;
895   }
896 duplicate_frame:
897   {
898     GST_WARNING_OBJECT (ffmpegdec, "already alloc'ed output buffer for frame");
899     gst_video_codec_frame_unref (frame);
900     return -1;
901   }
902 no_frame:
903   {
904     GST_WARNING_OBJECT (ffmpegdec, "Couldn't get codec frame !");
905     return -1;
906   }
907 }
908
909 static gboolean
910 picture_changed (GstFFMpegVidDec * ffmpegdec, AVFrame * picture)
911 {
912   return !(ffmpegdec->pic_width == picture->width
913       && ffmpegdec->pic_height == picture->height
914       && ffmpegdec->pic_pix_fmt == picture->format
915       && ffmpegdec->pic_par_n == picture->sample_aspect_ratio.num
916       && ffmpegdec->pic_par_d == picture->sample_aspect_ratio.den
917       && ffmpegdec->pic_interlaced == picture->interlaced_frame);
918 }
919
920 static gboolean
921 context_changed (GstFFMpegVidDec * ffmpegdec, AVCodecContext * context)
922 {
923   return !(ffmpegdec->ctx_ticks == context->ticks_per_frame
924       && ffmpegdec->ctx_time_n == context->time_base.num
925       && ffmpegdec->ctx_time_d == context->time_base.den);
926 }
927
928 static gboolean
929 update_video_context (GstFFMpegVidDec * ffmpegdec, AVCodecContext * context,
930     AVFrame * picture)
931 {
932   if (!picture_changed (ffmpegdec, picture)
933       && !context_changed (ffmpegdec, context))
934     return FALSE;
935
936   GST_DEBUG_OBJECT (ffmpegdec,
937       "Renegotiating video from %dx%d@ %d:%d PAR %d/%d fps pixfmt %d to %dx%d@ %d:%d PAR %d/%d fps pixfmt %d",
938       ffmpegdec->pic_width, ffmpegdec->pic_height,
939       ffmpegdec->pic_par_n, ffmpegdec->pic_par_d,
940       ffmpegdec->ctx_time_n, ffmpegdec->ctx_time_d,
941       ffmpegdec->pic_pix_fmt,
942       picture->width, picture->height,
943       picture->sample_aspect_ratio.num,
944       picture->sample_aspect_ratio.den,
945       context->time_base.num, context->time_base.den, picture->format);
946
947   ffmpegdec->pic_pix_fmt = picture->format;
948   ffmpegdec->pic_width = picture->width;
949   ffmpegdec->pic_height = picture->height;
950   ffmpegdec->pic_par_n = picture->sample_aspect_ratio.num;
951   ffmpegdec->pic_par_d = picture->sample_aspect_ratio.den;
952   ffmpegdec->pic_interlaced = picture->interlaced_frame;
953   ffmpegdec->ctx_ticks = context->ticks_per_frame;
954   ffmpegdec->ctx_time_n = context->time_base.num;
955   ffmpegdec->ctx_time_d = context->time_base.den;
956
957   return TRUE;
958 }
959
960 static void
961 gst_ffmpegviddec_update_par (GstFFMpegVidDec * ffmpegdec,
962     GstVideoInfo * in_info, GstVideoInfo * out_info)
963 {
964   gboolean demuxer_par_set = FALSE;
965   gboolean decoder_par_set = FALSE;
966   gint demuxer_num = 1, demuxer_denom = 1;
967   gint decoder_num = 1, decoder_denom = 1;
968
969   if (in_info->par_n && in_info->par_d) {
970     demuxer_num = in_info->par_n;
971     demuxer_denom = in_info->par_d;
972     demuxer_par_set = TRUE;
973     GST_DEBUG_OBJECT (ffmpegdec, "Demuxer PAR: %d:%d", demuxer_num,
974         demuxer_denom);
975   }
976
977   if (ffmpegdec->pic_par_n && ffmpegdec->pic_par_d) {
978     decoder_num = ffmpegdec->pic_par_n;
979     decoder_denom = ffmpegdec->pic_par_d;
980     decoder_par_set = TRUE;
981     GST_DEBUG_OBJECT (ffmpegdec, "Decoder PAR: %d:%d", decoder_num,
982         decoder_denom);
983   }
984
985   if (!demuxer_par_set && !decoder_par_set)
986     goto no_par;
987
988   if (demuxer_par_set && !decoder_par_set)
989     goto use_demuxer_par;
990
991   if (decoder_par_set && !demuxer_par_set)
992     goto use_decoder_par;
993
994   /* Both the demuxer and the decoder provide a PAR. If one of
995    * the two PARs is 1:1 and the other one is not, use the one
996    * that is not 1:1. */
997   if (demuxer_num == demuxer_denom && decoder_num != decoder_denom)
998     goto use_decoder_par;
999
1000   if (decoder_num == decoder_denom && demuxer_num != demuxer_denom)
1001     goto use_demuxer_par;
1002
1003   /* Both PARs are non-1:1, so use the PAR provided by the demuxer */
1004   goto use_demuxer_par;
1005
1006 use_decoder_par:
1007   {
1008     GST_DEBUG_OBJECT (ffmpegdec,
1009         "Setting decoder provided pixel-aspect-ratio of %u:%u", decoder_num,
1010         decoder_denom);
1011     out_info->par_n = decoder_num;
1012     out_info->par_d = decoder_denom;
1013     return;
1014   }
1015 use_demuxer_par:
1016   {
1017     GST_DEBUG_OBJECT (ffmpegdec,
1018         "Setting demuxer provided pixel-aspect-ratio of %u:%u", demuxer_num,
1019         demuxer_denom);
1020     out_info->par_n = demuxer_num;
1021     out_info->par_d = demuxer_denom;
1022     return;
1023   }
1024 no_par:
1025   {
1026     GST_DEBUG_OBJECT (ffmpegdec,
1027         "Neither demuxer nor codec provide a pixel-aspect-ratio");
1028     out_info->par_n = 1;
1029     out_info->par_d = 1;
1030     return;
1031   }
1032 }
1033
1034 static gboolean
1035 gst_ffmpegviddec_negotiate (GstFFMpegVidDec * ffmpegdec,
1036     AVCodecContext * context, AVFrame * picture)
1037 {
1038   GstVideoFormat fmt;
1039   GstVideoInfo *in_info, *out_info;
1040   GstVideoCodecState *output_state;
1041   gint fps_n, fps_d;
1042
1043   if (!update_video_context (ffmpegdec, context, picture))
1044     return TRUE;
1045
1046   fmt = gst_ffmpeg_pixfmt_to_videoformat (ffmpegdec->pic_pix_fmt);
1047   if (G_UNLIKELY (fmt == GST_VIDEO_FORMAT_UNKNOWN))
1048     goto unknown_format;
1049
1050   output_state =
1051       gst_video_decoder_set_output_state (GST_VIDEO_DECODER (ffmpegdec), fmt,
1052       ffmpegdec->pic_width, ffmpegdec->pic_height, ffmpegdec->input_state);
1053   if (ffmpegdec->output_state)
1054     gst_video_codec_state_unref (ffmpegdec->output_state);
1055   ffmpegdec->output_state = output_state;
1056
1057   in_info = &ffmpegdec->input_state->info;
1058   out_info = &ffmpegdec->output_state->info;
1059
1060   /* set the interlaced flag */
1061   if (ffmpegdec->pic_interlaced)
1062     out_info->interlace_mode = GST_VIDEO_INTERLACE_MODE_MIXED;
1063   else
1064     out_info->interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
1065
1066   switch (context->chroma_sample_location) {
1067     case 1:
1068       out_info->chroma_site = GST_VIDEO_CHROMA_SITE_MPEG2;
1069       break;
1070     case 2:
1071       out_info->chroma_site = GST_VIDEO_CHROMA_SITE_JPEG;
1072       break;
1073     case 3:
1074       out_info->chroma_site = GST_VIDEO_CHROMA_SITE_DV;
1075       break;
1076     case 4:
1077       out_info->chroma_site = GST_VIDEO_CHROMA_SITE_V_COSITED;
1078       break;
1079     default:
1080       break;
1081   }
1082
1083   /* try to find a good framerate */
1084   if ((in_info->fps_d && in_info->fps_n) ||
1085       GST_VIDEO_INFO_FLAG_IS_SET (in_info, GST_VIDEO_FLAG_VARIABLE_FPS)) {
1086     /* take framerate from input when it was specified (#313970) */
1087     fps_n = in_info->fps_n;
1088     fps_d = in_info->fps_d;
1089   } else {
1090     fps_n = ffmpegdec->ctx_time_d / ffmpegdec->ctx_ticks;
1091     fps_d = ffmpegdec->ctx_time_n;
1092
1093     if (!fps_d) {
1094       GST_LOG_OBJECT (ffmpegdec, "invalid framerate: %d/0, -> %d/1", fps_n,
1095           fps_n);
1096       fps_d = 1;
1097     }
1098     if (gst_util_fraction_compare (fps_n, fps_d, 1000, 1) > 0) {
1099       GST_LOG_OBJECT (ffmpegdec, "excessive framerate: %d/%d, -> 0/1", fps_n,
1100           fps_d);
1101       fps_n = 0;
1102       fps_d = 1;
1103     }
1104   }
1105
1106   GST_LOG_OBJECT (ffmpegdec, "setting framerate: %d/%d", fps_n, fps_d);
1107   out_info->fps_n = fps_n;
1108   out_info->fps_d = fps_d;
1109
1110   /* calculate and update par now */
1111   gst_ffmpegviddec_update_par (ffmpegdec, in_info, out_info);
1112
1113   /* Copy stereo/multiview info from upstream if set */
1114   if (GST_VIDEO_INFO_MULTIVIEW_MODE (in_info) != GST_VIDEO_MULTIVIEW_MODE_NONE) {
1115     GST_VIDEO_INFO_MULTIVIEW_MODE (out_info) =
1116         GST_VIDEO_INFO_MULTIVIEW_MODE (in_info);
1117     GST_VIDEO_INFO_MULTIVIEW_FLAGS (out_info) =
1118         GST_VIDEO_INFO_MULTIVIEW_FLAGS (in_info);
1119   }
1120
1121   if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (ffmpegdec)))
1122     goto negotiate_failed;
1123
1124   return TRUE;
1125
1126   /* ERRORS */
1127 unknown_format:
1128   {
1129     GST_ERROR_OBJECT (ffmpegdec,
1130         "decoder requires a video format unsupported by GStreamer");
1131     return FALSE;
1132   }
1133 negotiate_failed:
1134   {
1135     /* Reset so we try again next time even if force==FALSE */
1136     ffmpegdec->pic_pix_fmt = 0;
1137     ffmpegdec->pic_width = 0;
1138     ffmpegdec->pic_height = 0;
1139     ffmpegdec->pic_par_n = 0;
1140     ffmpegdec->pic_par_d = 0;
1141     ffmpegdec->ctx_ticks = 0;
1142     ffmpegdec->ctx_time_n = 0;
1143     ffmpegdec->ctx_time_d = 0;
1144
1145     GST_ERROR_OBJECT (ffmpegdec, "negotiation failed");
1146     return FALSE;
1147   }
1148 }
1149
1150 /* perform qos calculations before decoding the next frame.
1151  *
1152  * Sets the skip_frame flag and if things are really bad, skips to the next
1153  * keyframe.
1154  *
1155  */
1156 static void
1157 gst_ffmpegviddec_do_qos (GstFFMpegVidDec * ffmpegdec,
1158     GstVideoCodecFrame * frame, gboolean * mode_switch)
1159 {
1160   GstClockTimeDiff diff;
1161   GstSegmentFlags skip_flags =
1162       GST_VIDEO_DECODER_INPUT_SEGMENT (ffmpegdec).flags;
1163
1164   *mode_switch = FALSE;
1165
1166   if (frame == NULL)
1167     return;
1168
1169   if (skip_flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) {
1170     ffmpegdec->context->skip_frame = AVDISCARD_NONKEY;
1171     *mode_switch = TRUE;
1172   } else if (skip_flags & GST_SEGMENT_FLAG_TRICKMODE) {
1173     ffmpegdec->context->skip_frame = AVDISCARD_NONREF;
1174     *mode_switch = TRUE;
1175   }
1176
1177   diff =
1178       gst_video_decoder_get_max_decode_time (GST_VIDEO_DECODER (ffmpegdec),
1179       frame);
1180
1181   /* if we don't have timing info, then we don't do QoS */
1182   if (G_UNLIKELY (diff == G_MAXINT64))
1183     return;
1184
1185   GST_DEBUG_OBJECT (ffmpegdec, "decoding time %" G_GINT64_FORMAT, diff);
1186
1187   if (*mode_switch == FALSE) {
1188     if (diff > 0 && ffmpegdec->context->skip_frame != AVDISCARD_DEFAULT) {
1189       ffmpegdec->context->skip_frame = AVDISCARD_DEFAULT;
1190       *mode_switch = TRUE;
1191       GST_DEBUG_OBJECT (ffmpegdec, "QOS: normal mode");
1192     }
1193
1194     else if (diff <= 0 && ffmpegdec->context->skip_frame != AVDISCARD_NONREF) {
1195       ffmpegdec->context->skip_frame = AVDISCARD_NONREF;
1196       *mode_switch = TRUE;
1197       GST_DEBUG_OBJECT (ffmpegdec,
1198           "QOS: hurry up, diff %" G_GINT64_FORMAT " >= 0", diff);
1199     }
1200   }
1201 }
1202
1203 /* get an outbuf buffer with the current picture */
1204 static GstFlowReturn
1205 get_output_buffer (GstFFMpegVidDec * ffmpegdec, GstVideoCodecFrame * frame)
1206 {
1207   GstFlowReturn ret = GST_FLOW_OK;
1208   AVPicture pic, *outpic;
1209   GstVideoFrame vframe;
1210   GstVideoInfo *info;
1211   gint c;
1212
1213   GST_LOG_OBJECT (ffmpegdec, "get output buffer");
1214
1215   if (!ffmpegdec->output_state)
1216     goto not_negotiated;
1217
1218   ret =
1219       gst_video_decoder_allocate_output_frame (GST_VIDEO_DECODER (ffmpegdec),
1220       frame);
1221   if (G_UNLIKELY (ret != GST_FLOW_OK))
1222     goto alloc_failed;
1223
1224   /* original ffmpeg code does not handle odd sizes correctly.
1225    * This patched up version does */
1226   /* Fill avpicture */
1227   info = &ffmpegdec->output_state->info;
1228   if (!gst_video_frame_map (&vframe, info, frame->output_buffer,
1229           GST_MAP_READ | GST_MAP_WRITE))
1230     goto alloc_failed;
1231
1232   for (c = 0; c < AV_NUM_DATA_POINTERS; c++) {
1233     if (c < GST_VIDEO_INFO_N_PLANES (info)) {
1234       pic.data[c] = GST_VIDEO_FRAME_PLANE_DATA (&vframe, c);
1235       pic.linesize[c] = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, c);
1236       GST_LOG_OBJECT (ffmpegdec, "[%i] linesize %d, data %p", c,
1237           pic.linesize[c], pic.data[c]);
1238     } else {
1239       pic.data[c] = NULL;
1240       pic.linesize[c] = 0;
1241     }
1242   }
1243
1244   outpic = (AVPicture *) ffmpegdec->picture;
1245
1246   av_picture_copy (&pic, outpic, ffmpegdec->context->pix_fmt,
1247       GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info));
1248
1249   gst_video_frame_unmap (&vframe);
1250
1251   ffmpegdec->picture->reordered_opaque = -1;
1252
1253   return ret;
1254
1255   /* special cases */
1256 alloc_failed:
1257   {
1258     GST_DEBUG_OBJECT (ffmpegdec, "allocation failed");
1259     return ret;
1260   }
1261 not_negotiated:
1262   {
1263     GST_DEBUG_OBJECT (ffmpegdec, "not negotiated");
1264     return GST_FLOW_NOT_NEGOTIATED;
1265   }
1266 }
1267
1268 static void
1269 gst_avpacket_init (AVPacket * packet, guint8 * data, guint size)
1270 {
1271   memset (packet, 0, sizeof (AVPacket));
1272   packet->data = data;
1273   packet->size = size;
1274 }
1275
1276 /* gst_ffmpegviddec_[video|audio]_frame:
1277  * ffmpegdec:
1278  * data: pointer to the data to decode
1279  * size: size of data in bytes
1280  * in_timestamp: incoming timestamp.
1281  * in_duration: incoming duration.
1282  * in_offset: incoming offset (frame number).
1283  * ret: Return flow.
1284  *
1285  * Returns: number of bytes used in decoding. The check for successful decode is
1286  *   outbuf being non-NULL.
1287  */
1288 static gint
1289 gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec,
1290     guint8 * data, guint size, gint * have_data, GstVideoCodecFrame * frame,
1291     GstFlowReturn * ret)
1292 {
1293   gint len = -1;
1294   gboolean mode_switch;
1295   GstVideoCodecFrame *out_frame;
1296   GstFFMpegVidDecVideoFrame *out_dframe;
1297   AVPacket packet;
1298   GstBufferPool *pool;
1299
1300   *ret = GST_FLOW_OK;
1301
1302   /* in case we skip frames */
1303   ffmpegdec->picture->pict_type = -1;
1304
1305   /* run QoS code, we don't stop decoding the frame when we are late because
1306    * else we might skip a reference frame */
1307   gst_ffmpegviddec_do_qos (ffmpegdec, frame, &mode_switch);
1308
1309   if (ffmpegdec->is_realvideo && data != NULL) {
1310     gint slice_count;
1311     gint i;
1312
1313     /* setup the slice table for realvideo */
1314     if (ffmpegdec->context->slice_offset == NULL)
1315       ffmpegdec->context->slice_offset = g_malloc (sizeof (guint32) * 1000);
1316
1317     slice_count = (*data++) + 1;
1318     ffmpegdec->context->slice_count = slice_count;
1319
1320     for (i = 0; i < slice_count; i++) {
1321       data += 4;
1322       ffmpegdec->context->slice_offset[i] = GST_READ_UINT32_LE (data);
1323       data += 4;
1324     }
1325   }
1326
1327   if (frame) {
1328     /* save reference to the timing info */
1329     ffmpegdec->context->reordered_opaque = (gint64) frame->system_frame_number;
1330     ffmpegdec->picture->reordered_opaque = (gint64) frame->system_frame_number;
1331
1332     GST_DEBUG_OBJECT (ffmpegdec, "stored opaque values idx %d",
1333         frame->system_frame_number);
1334   }
1335
1336   /* now decode the frame */
1337   gst_avpacket_init (&packet, data, size);
1338
1339   if (ffmpegdec->palette) {
1340     guint8 *pal;
1341
1342     pal = av_packet_new_side_data (&packet, AV_PKT_DATA_PALETTE,
1343         AVPALETTE_SIZE);
1344     gst_buffer_extract (ffmpegdec->palette, 0, pal, AVPALETTE_SIZE);
1345     GST_DEBUG_OBJECT (ffmpegdec, "copy pal %p %p", &packet, pal);
1346   }
1347
1348   /* This might call into get_buffer() from another thread,
1349    * which would cause a deadlock. Release the lock here
1350    * and taking it again later seems safe
1351    * See https://bugzilla.gnome.org/show_bug.cgi?id=726020
1352    */
1353   GST_VIDEO_DECODER_STREAM_UNLOCK (ffmpegdec);
1354   len = avcodec_decode_video2 (ffmpegdec->context,
1355       ffmpegdec->picture, have_data, &packet);
1356   GST_VIDEO_DECODER_STREAM_LOCK (ffmpegdec);
1357
1358   GST_DEBUG_OBJECT (ffmpegdec, "after decode: len %d, have_data %d",
1359       len, *have_data);
1360
1361   /* when we are in skip_frame mode, don't complain when ffmpeg returned
1362    * no data because we told it to skip stuff. */
1363   if (len < 0 && (mode_switch || ffmpegdec->context->skip_frame))
1364     len = 0;
1365
1366   /* no data, we're done */
1367   if (len < 0 || *have_data == 0)
1368     goto beach;
1369
1370   /* get the output picture timing info again */
1371   out_dframe = ffmpegdec->picture->opaque;
1372   out_frame = gst_video_codec_frame_ref (out_dframe->frame);
1373
1374   /* also give back a buffer allocated by the frame, if any */
1375   gst_buffer_replace (&out_frame->output_buffer, out_dframe->buffer);
1376   gst_buffer_replace (&out_dframe->buffer, NULL);
1377
1378   GST_DEBUG_OBJECT (ffmpegdec,
1379       "pts %" G_GUINT64_FORMAT " duration %" G_GUINT64_FORMAT,
1380       out_frame->pts, out_frame->duration);
1381   GST_DEBUG_OBJECT (ffmpegdec, "picture: pts %" G_GUINT64_FORMAT,
1382       (guint64) ffmpegdec->picture->pts);
1383   GST_DEBUG_OBJECT (ffmpegdec, "picture: num %d",
1384       ffmpegdec->picture->coded_picture_number);
1385   GST_DEBUG_OBJECT (ffmpegdec, "picture: ref %d",
1386       ffmpegdec->picture->reference);
1387   GST_DEBUG_OBJECT (ffmpegdec, "picture: display %d",
1388       ffmpegdec->picture->display_picture_number);
1389   GST_DEBUG_OBJECT (ffmpegdec, "picture: opaque %p",
1390       ffmpegdec->picture->opaque);
1391   GST_DEBUG_OBJECT (ffmpegdec, "picture: reordered opaque %" G_GUINT64_FORMAT,
1392       (guint64) ffmpegdec->picture->reordered_opaque);
1393   GST_DEBUG_OBJECT (ffmpegdec, "repeat_pict:%d",
1394       ffmpegdec->picture->repeat_pict);
1395   GST_DEBUG_OBJECT (ffmpegdec, "corrupted frame: %d",
1396       ! !(ffmpegdec->picture->flags & AV_FRAME_FLAG_CORRUPT));
1397
1398   if (!gst_ffmpegviddec_negotiate (ffmpegdec, ffmpegdec->context,
1399           ffmpegdec->picture))
1400     goto negotiation_error;
1401
1402   pool = gst_video_decoder_get_buffer_pool (GST_VIDEO_DECODER (ffmpegdec));
1403   if (G_UNLIKELY (out_frame->output_buffer == NULL)) {
1404     *ret = get_output_buffer (ffmpegdec, out_frame);
1405   } else if (G_UNLIKELY (out_frame->output_buffer->pool != pool)) {
1406     GstBuffer *tmp = out_frame->output_buffer;
1407     out_frame->output_buffer = NULL;
1408     *ret = get_output_buffer (ffmpegdec, out_frame);
1409     gst_buffer_unref (tmp);
1410   }
1411   gst_object_unref (pool);
1412
1413   if (G_UNLIKELY (*ret != GST_FLOW_OK))
1414     goto no_output;
1415
1416   /* Mark corrupted frames as corrupted */
1417   if (ffmpegdec->picture->flags & AV_FRAME_FLAG_CORRUPT)
1418     GST_BUFFER_FLAG_SET (out_frame->output_buffer, GST_BUFFER_FLAG_CORRUPTED);
1419
1420   if (ffmpegdec->pic_interlaced) {
1421     /* set interlaced flags */
1422     if (ffmpegdec->picture->repeat_pict)
1423       GST_BUFFER_FLAG_SET (out_frame->output_buffer, GST_VIDEO_BUFFER_FLAG_RFF);
1424     if (ffmpegdec->picture->top_field_first)
1425       GST_BUFFER_FLAG_SET (out_frame->output_buffer, GST_VIDEO_BUFFER_FLAG_TFF);
1426     if (ffmpegdec->picture->interlaced_frame)
1427       GST_BUFFER_FLAG_SET (out_frame->output_buffer,
1428           GST_VIDEO_BUFFER_FLAG_INTERLACED);
1429   }
1430
1431   /* cleaning time */
1432   /* so we decoded this frame, frames preceding it in decoding order
1433    * that still do not have a buffer allocated seem rather useless,
1434    * and can be discarded, due to e.g. misparsed bogus frame
1435    * or non-keyframe in skipped decoding, ...
1436    * In any case, not likely to be seen again, so discard those,
1437    * before they pile up and/or mess with timestamping */
1438   {
1439     GList *l, *ol;
1440     GstVideoDecoder *dec = GST_VIDEO_DECODER (ffmpegdec);
1441     gboolean old = TRUE;
1442
1443     ol = l = gst_video_decoder_get_frames (dec);
1444     while (l) {
1445       GstVideoCodecFrame *tmp = l->data;
1446
1447       if (tmp == frame)
1448         old = FALSE;
1449
1450       if (old && GST_VIDEO_CODEC_FRAME_IS_DECODE_ONLY (tmp)) {
1451         GST_LOG_OBJECT (dec,
1452             "discarding ghost frame %p (#%d) PTS:%" GST_TIME_FORMAT " DTS:%"
1453             GST_TIME_FORMAT, tmp, tmp->system_frame_number,
1454             GST_TIME_ARGS (tmp->pts), GST_TIME_ARGS (tmp->dts));
1455         /* drop extra ref and remove from frame list */
1456         gst_video_decoder_release_frame (dec, tmp);
1457       } else {
1458         /* drop extra ref we got */
1459         gst_video_codec_frame_unref (tmp);
1460       }
1461       l = l->next;
1462     }
1463     g_list_free (ol);
1464   }
1465
1466   av_frame_unref (ffmpegdec->picture);
1467
1468   /* FIXME: Ideally we would remap the buffer read-only now before pushing but
1469    * libav might still have a reference to it!
1470    */
1471   *ret =
1472       gst_video_decoder_finish_frame (GST_VIDEO_DECODER (ffmpegdec), out_frame);
1473
1474 beach:
1475   GST_DEBUG_OBJECT (ffmpegdec, "return flow %s, len %d",
1476       gst_flow_get_name (*ret), len);
1477   return len;
1478
1479   /* special cases */
1480 no_output:
1481   {
1482     GST_DEBUG_OBJECT (ffmpegdec, "no output buffer");
1483     gst_video_decoder_drop_frame (GST_VIDEO_DECODER (ffmpegdec), out_frame);
1484     len = -1;
1485     goto beach;
1486   }
1487
1488 negotiation_error:
1489   {
1490     if (GST_PAD_IS_FLUSHING (GST_VIDEO_DECODER_SRC_PAD (ffmpegdec))) {
1491       *ret = GST_FLOW_FLUSHING;
1492       goto beach;
1493     }
1494     GST_WARNING_OBJECT (ffmpegdec, "Error negotiating format");
1495     *ret = GST_FLOW_NOT_NEGOTIATED;
1496     goto beach;
1497   }
1498 }
1499
1500
1501 /* gst_ffmpegviddec_frame:
1502  * ffmpegdec:
1503  * data: pointer to the data to decode
1504  * size: size of data in bytes
1505  * got_data: 0 if no data was decoded, != 0 otherwise.
1506  * in_time: timestamp of data
1507  * in_duration: duration of data
1508  * ret: GstFlowReturn to return in the chain function
1509  *
1510  * Decode the given frame and pushes it downstream.
1511  *
1512  * Returns: Number of bytes used in decoding, -1 on error/failure.
1513  */
1514
1515 static gint
1516 gst_ffmpegviddec_frame (GstFFMpegVidDec * ffmpegdec,
1517     guint8 * data, guint size, gint * have_data, GstVideoCodecFrame * frame,
1518     GstFlowReturn * ret)
1519 {
1520   GstFFMpegVidDecClass *oclass;
1521   gint len = 0;
1522
1523   if (G_UNLIKELY (ffmpegdec->context->codec == NULL))
1524     goto no_codec;
1525
1526   GST_LOG_OBJECT (ffmpegdec, "data:%p, size:%d", data, size);
1527
1528   *ret = GST_FLOW_OK;
1529   ffmpegdec->context->frame_number++;
1530
1531   oclass = (GstFFMpegVidDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec));
1532
1533   len =
1534       gst_ffmpegviddec_video_frame (ffmpegdec, data, size, have_data, frame,
1535       ret);
1536
1537   if (len < 0) {
1538     GST_WARNING_OBJECT (ffmpegdec,
1539         "avdec_%s: decoding error (len: %d, have_data: %d)",
1540         oclass->in_plugin->name, len, *have_data);
1541   }
1542
1543   return len;
1544
1545   /* ERRORS */
1546 no_codec:
1547   {
1548     GST_ERROR_OBJECT (ffmpegdec, "no codec context");
1549     *ret = GST_FLOW_NOT_NEGOTIATED;
1550     return -1;
1551   }
1552 }
1553
1554 static void
1555 gst_ffmpegviddec_drain (GstFFMpegVidDec * ffmpegdec)
1556 {
1557   GstFFMpegVidDecClass *oclass;
1558
1559   if (!ffmpegdec->opened)
1560     return;
1561
1562   oclass = (GstFFMpegVidDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec));
1563
1564   if (oclass->in_plugin->capabilities & CODEC_CAP_DELAY) {
1565     gint have_data, len;
1566     GstFlowReturn ret;
1567
1568     GST_LOG_OBJECT (ffmpegdec,
1569         "codec has delay capabilities, calling until ffmpeg has drained everything");
1570
1571     do {
1572       len = gst_ffmpegviddec_frame (ffmpegdec, NULL, 0, &have_data, NULL, &ret);
1573     } while (len >= 0 && have_data == 1 && ret == GST_FLOW_OK);
1574     avcodec_flush_buffers (ffmpegdec->context);
1575   }
1576 }
1577
1578 static GstFlowReturn
1579 gst_ffmpegviddec_handle_frame (GstVideoDecoder * decoder,
1580     GstVideoCodecFrame * frame)
1581 {
1582   GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) decoder;
1583   guint8 *data, *bdata;
1584   gint size, len, have_data, bsize;
1585   GstMapInfo minfo;
1586   GstFlowReturn ret = GST_FLOW_OK;
1587   gboolean do_padding;
1588
1589   GST_LOG_OBJECT (ffmpegdec,
1590       "Received new data of size %" G_GSIZE_FORMAT ", dts %" GST_TIME_FORMAT
1591       ", pts:%" GST_TIME_FORMAT ", dur:%" GST_TIME_FORMAT,
1592       gst_buffer_get_size (frame->input_buffer), GST_TIME_ARGS (frame->dts),
1593       GST_TIME_ARGS (frame->pts), GST_TIME_ARGS (frame->duration));
1594
1595   if (!gst_buffer_map (frame->input_buffer, &minfo, GST_MAP_READ)) {
1596     GST_ELEMENT_ERROR (ffmpegdec, STREAM, DECODE, ("Decoding problem"),
1597         ("Failed to map buffer for reading"));
1598     return GST_FLOW_ERROR;
1599   }
1600
1601   /* treat frame as void until a buffer is requested for it */
1602   GST_VIDEO_CODEC_FRAME_FLAG_SET (frame,
1603       GST_VIDEO_CODEC_FRAME_FLAG_DECODE_ONLY);
1604
1605   bdata = minfo.data;
1606   bsize = minfo.size;
1607
1608   if (bsize > 0 && (!GST_MEMORY_IS_ZERO_PADDED (minfo.memory)
1609           || (minfo.maxsize - minfo.size) < FF_INPUT_BUFFER_PADDING_SIZE)) {
1610     /* add padding */
1611     if (ffmpegdec->padded_size < bsize + FF_INPUT_BUFFER_PADDING_SIZE) {
1612       ffmpegdec->padded_size = bsize + FF_INPUT_BUFFER_PADDING_SIZE;
1613       ffmpegdec->padded = g_realloc (ffmpegdec->padded, ffmpegdec->padded_size);
1614       GST_LOG_OBJECT (ffmpegdec, "resized padding buffer to %d",
1615           ffmpegdec->padded_size);
1616     }
1617     GST_CAT_TRACE_OBJECT (GST_CAT_PERFORMANCE, ffmpegdec,
1618         "Copy input to add padding");
1619     memcpy (ffmpegdec->padded, bdata, bsize);
1620     memset (ffmpegdec->padded + bsize, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1621
1622     bdata = ffmpegdec->padded;
1623     do_padding = TRUE;
1624   } else {
1625     do_padding = FALSE;
1626   }
1627
1628   do {
1629     guint8 tmp_padding[FF_INPUT_BUFFER_PADDING_SIZE];
1630
1631     /* parse, if at all possible */
1632     data = bdata;
1633     size = bsize;
1634
1635     if (do_padding) {
1636       /* add temporary padding */
1637       GST_CAT_TRACE_OBJECT (GST_CAT_PERFORMANCE, ffmpegdec,
1638           "Add temporary input padding");
1639       memcpy (tmp_padding, data + size, FF_INPUT_BUFFER_PADDING_SIZE);
1640       memset (data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1641     }
1642
1643     /* decode a frame of audio/video now */
1644     len =
1645         gst_ffmpegviddec_frame (ffmpegdec, data, size, &have_data, frame, &ret);
1646
1647     if (ret != GST_FLOW_OK) {
1648       GST_LOG_OBJECT (ffmpegdec, "breaking because of flow ret %s",
1649           gst_flow_get_name (ret));
1650       /* bad flow return, make sure we discard all data and exit */
1651       bsize = 0;
1652       break;
1653     }
1654
1655     if (do_padding) {
1656       memcpy (data + size, tmp_padding, FF_INPUT_BUFFER_PADDING_SIZE);
1657     }
1658
1659     if (len == 0 && have_data == 0) {
1660       /* nothing was decoded, this could be because no data was available or
1661        * because we were skipping frames.
1662        * If we have no context we must exit and wait for more data, we keep the
1663        * data we tried. */
1664       GST_LOG_OBJECT (ffmpegdec, "Decoding didn't return any data, breaking");
1665       break;
1666     }
1667
1668     if (len < 0) {
1669       /* a decoding error happened, we must break and try again with next data. */
1670       GST_LOG_OBJECT (ffmpegdec, "Decoding error, breaking");
1671       bsize = 0;
1672       break;
1673     }
1674
1675     /* prepare for the next round, for codecs with a context we did this
1676      * already when using the parser. */
1677     bsize -= len;
1678     bdata += len;
1679
1680     do_padding = TRUE;
1681
1682     GST_LOG_OBJECT (ffmpegdec, "Before (while bsize>0).  bsize:%d , bdata:%p",
1683         bsize, bdata);
1684   } while (bsize > 0);
1685
1686   if (bsize > 0)
1687     GST_DEBUG_OBJECT (ffmpegdec, "Dropping %d bytes of data", bsize);
1688
1689   gst_buffer_unmap (frame->input_buffer, &minfo);
1690   gst_video_codec_frame_unref (frame);
1691
1692   return ret;
1693 }
1694
1695 static gboolean
1696 gst_ffmpegviddec_start (GstVideoDecoder * decoder)
1697 {
1698   GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) decoder;
1699   GstFFMpegVidDecClass *oclass;
1700
1701   oclass = (GstFFMpegVidDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec));
1702
1703   GST_OBJECT_LOCK (ffmpegdec);
1704   gst_ffmpeg_avcodec_close (ffmpegdec->context);
1705   if (avcodec_get_context_defaults3 (ffmpegdec->context, oclass->in_plugin) < 0) {
1706     GST_DEBUG_OBJECT (ffmpegdec, "Failed to set context defaults");
1707     GST_OBJECT_UNLOCK (ffmpegdec);
1708     return FALSE;
1709   }
1710   ffmpegdec->context->opaque = ffmpegdec;
1711   GST_OBJECT_UNLOCK (ffmpegdec);
1712
1713   return TRUE;
1714 }
1715
1716 static gboolean
1717 gst_ffmpegviddec_stop (GstVideoDecoder * decoder)
1718 {
1719   GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) decoder;
1720
1721   GST_OBJECT_LOCK (ffmpegdec);
1722   gst_ffmpegviddec_close (ffmpegdec, FALSE);
1723   GST_OBJECT_UNLOCK (ffmpegdec);
1724   g_free (ffmpegdec->padded);
1725   ffmpegdec->padded = NULL;
1726   ffmpegdec->padded_size = 0;
1727   if (ffmpegdec->input_state)
1728     gst_video_codec_state_unref (ffmpegdec->input_state);
1729   ffmpegdec->input_state = NULL;
1730   if (ffmpegdec->output_state)
1731     gst_video_codec_state_unref (ffmpegdec->output_state);
1732   ffmpegdec->output_state = NULL;
1733
1734   if (ffmpegdec->internal_pool)
1735     gst_object_unref (ffmpegdec->internal_pool);
1736   ffmpegdec->internal_pool = NULL;
1737
1738   ffmpegdec->pic_pix_fmt = 0;
1739   ffmpegdec->pic_width = 0;
1740   ffmpegdec->pic_height = 0;
1741   ffmpegdec->pic_par_n = 0;
1742   ffmpegdec->pic_par_d = 0;
1743   ffmpegdec->ctx_ticks = 0;
1744   ffmpegdec->ctx_time_n = 0;
1745   ffmpegdec->ctx_time_d = 0;
1746
1747   ffmpegdec->pool_width = 0;
1748   ffmpegdec->pool_height = 0;
1749   ffmpegdec->pool_format = 0;
1750
1751   return TRUE;
1752 }
1753
1754 static GstFlowReturn
1755 gst_ffmpegviddec_finish (GstVideoDecoder * decoder)
1756 {
1757   GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) decoder;
1758
1759   gst_ffmpegviddec_drain (ffmpegdec);
1760
1761   return GST_FLOW_OK;
1762 }
1763
1764 static gboolean
1765 gst_ffmpegviddec_flush (GstVideoDecoder * decoder)
1766 {
1767   GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) decoder;
1768
1769   if (ffmpegdec->opened)
1770     avcodec_flush_buffers (ffmpegdec->context);
1771
1772   return TRUE;
1773 }
1774
1775 static gboolean
1776 gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
1777 {
1778   GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) decoder;
1779   GstVideoCodecState *state;
1780   GstBufferPool *pool;
1781   guint size, min, max;
1782   GstStructure *config;
1783   gboolean have_pool, have_videometa, have_alignment, update_pool = FALSE;
1784   GstAllocator *allocator = NULL;
1785   GstAllocationParams params = DEFAULT_ALLOC_PARAM;
1786
1787   have_pool = (gst_query_get_n_allocation_pools (query) != 0);
1788
1789   if (!GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation (decoder,
1790           query))
1791     return FALSE;
1792
1793   state = gst_video_decoder_get_output_state (decoder);
1794
1795   if (gst_query_get_n_allocation_params (query) > 0) {
1796     gst_query_parse_nth_allocation_param (query, 0, &allocator, &params);
1797     params.align = MAX (params.align, DEFAULT_STRIDE_ALIGN);
1798   } else {
1799     gst_query_add_allocation_param (query, allocator, &params);
1800   }
1801
1802   gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
1803
1804   /* Don't use pool that can't grow, as we don't know how many buffer we'll
1805    * need, otherwise we may stall */
1806   if (max != 0 && max < REQUIRED_POOL_MAX_BUFFERS) {
1807     gst_object_unref (pool);
1808     pool = gst_video_buffer_pool_new ();
1809     max = 0;
1810     update_pool = TRUE;
1811     have_pool = FALSE;
1812
1813     /* if there is an allocator, also drop it, as it might be the reason we
1814      * have this limit. Default will be used */
1815     if (allocator) {
1816       gst_object_unref (allocator);
1817       allocator = NULL;
1818     }
1819   }
1820
1821   config = gst_buffer_pool_get_config (pool);
1822   gst_buffer_pool_config_set_params (config, state->caps, size, min, max);
1823   gst_buffer_pool_config_set_allocator (config, allocator, &params);
1824
1825   have_videometa =
1826       gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
1827
1828   if (have_videometa)
1829     gst_buffer_pool_config_add_option (config,
1830         GST_BUFFER_POOL_OPTION_VIDEO_META);
1831
1832   have_alignment =
1833       gst_buffer_pool_has_option (pool, GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT);
1834
1835   /* If we have videometa, we never have to copy */
1836   if (have_videometa && have_pool && have_alignment &&
1837       gst_ffmpegviddec_can_direct_render (ffmpegdec)) {
1838     GstStructure *config_copy = gst_structure_copy (config);
1839
1840     gst_ffmpegvideodec_prepare_dr_pool (ffmpegdec, pool, &state->info,
1841         config_copy);
1842
1843     /* FIXME validate and retry */
1844     if (gst_buffer_pool_set_config (pool, gst_structure_copy (config_copy))) {
1845       GstFlowReturn ret;
1846       GstBuffer *tmp;
1847
1848       gst_buffer_pool_set_active (pool, TRUE);
1849       ret = gst_buffer_pool_acquire_buffer (pool, &tmp, NULL);
1850       if (ret == GST_FLOW_OK) {
1851         GstVideoMeta *vmeta = gst_buffer_get_video_meta (tmp);
1852         gboolean same_stride = TRUE;
1853         gint i;
1854
1855         for (i = 0; i < vmeta->n_planes; i++) {
1856           if (vmeta->stride[i] != ffmpegdec->stride[i]) {
1857             same_stride = FALSE;
1858             break;
1859           }
1860         }
1861
1862         gst_buffer_unref (tmp);
1863
1864         if (same_stride) {
1865           if (ffmpegdec->internal_pool)
1866             gst_object_unref (ffmpegdec->internal_pool);
1867           ffmpegdec->internal_pool = gst_object_ref (pool);
1868           ffmpegdec->pool_info = state->info;
1869           gst_structure_free (config);
1870           goto done;
1871         }
1872       }
1873     }
1874   }
1875
1876   if (have_videometa && ffmpegdec->internal_pool) {
1877     update_pool = TRUE;
1878     gst_object_unref (pool);
1879     pool = gst_object_ref (ffmpegdec->internal_pool);
1880     gst_structure_free (config);
1881     goto done;
1882   }
1883
1884   /* configure */
1885   if (!gst_buffer_pool_set_config (pool, config)) {
1886     gboolean working_pool = FALSE;
1887     config = gst_buffer_pool_get_config (pool);
1888
1889     if (gst_buffer_pool_config_validate_params (config, state->caps, size, min,
1890             max)) {
1891       working_pool = gst_buffer_pool_set_config (pool, config);
1892     } else {
1893       gst_structure_free (config);
1894     }
1895
1896     if (!working_pool) {
1897       gst_object_unref (pool);
1898       pool = gst_video_buffer_pool_new ();
1899       config = gst_buffer_pool_get_config (pool);
1900       gst_buffer_pool_config_set_params (config, state->caps, size, min, max);
1901       gst_buffer_pool_config_set_allocator (config, NULL, &params);
1902       gst_buffer_pool_set_config (pool, config);
1903       update_pool = TRUE;
1904     }
1905   }
1906
1907 done:
1908   /* and store */
1909   if (update_pool)
1910     gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
1911
1912   gst_object_unref (pool);
1913   if (allocator)
1914     gst_object_unref (allocator);
1915   gst_video_codec_state_unref (state);
1916
1917   return TRUE;
1918 }
1919
1920 static gboolean
1921 gst_ffmpegviddec_propose_allocation (GstVideoDecoder * decoder,
1922     GstQuery * query)
1923 {
1924   GstAllocationParams params;
1925
1926   gst_allocation_params_init (&params);
1927   params.flags = GST_MEMORY_FLAG_ZERO_PADDED;
1928   params.align = DEFAULT_STRIDE_ALIGN;
1929   params.padding = FF_INPUT_BUFFER_PADDING_SIZE;
1930   /* we would like to have some padding so that we don't have to
1931    * memcpy. We don't suggest an allocator. */
1932   gst_query_add_allocation_param (query, NULL, &params);
1933
1934   return GST_VIDEO_DECODER_CLASS (parent_class)->propose_allocation (decoder,
1935       query);
1936 }
1937
1938 static void
1939 gst_ffmpegviddec_set_property (GObject * object,
1940     guint prop_id, const GValue * value, GParamSpec * pspec)
1941 {
1942   GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) object;
1943
1944   switch (prop_id) {
1945     case PROP_LOWRES:
1946       ffmpegdec->lowres = ffmpegdec->context->lowres = g_value_get_enum (value);
1947       break;
1948     case PROP_SKIPFRAME:
1949       ffmpegdec->skip_frame = ffmpegdec->context->skip_frame =
1950           g_value_get_enum (value);
1951       break;
1952     case PROP_DIRECT_RENDERING:
1953       ffmpegdec->direct_rendering = g_value_get_boolean (value);
1954       break;
1955     case PROP_DEBUG_MV:
1956       ffmpegdec->debug_mv = ffmpegdec->context->debug_mv =
1957           g_value_get_boolean (value);
1958       break;
1959     case PROP_MAX_THREADS:
1960       ffmpegdec->max_threads = g_value_get_int (value);
1961       break;
1962     case PROP_OUTPUT_CORRUPT:
1963       ffmpegdec->output_corrupt = g_value_get_boolean (value);
1964       break;
1965     default:
1966       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1967       break;
1968   }
1969 }
1970
1971 static void
1972 gst_ffmpegviddec_get_property (GObject * object,
1973     guint prop_id, GValue * value, GParamSpec * pspec)
1974 {
1975   GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) object;
1976
1977   switch (prop_id) {
1978     case PROP_LOWRES:
1979       g_value_set_enum (value, ffmpegdec->context->lowres);
1980       break;
1981     case PROP_SKIPFRAME:
1982       g_value_set_enum (value, ffmpegdec->context->skip_frame);
1983       break;
1984     case PROP_DIRECT_RENDERING:
1985       g_value_set_boolean (value, ffmpegdec->direct_rendering);
1986       break;
1987     case PROP_DEBUG_MV:
1988       g_value_set_boolean (value, ffmpegdec->context->debug_mv);
1989       break;
1990     case PROP_MAX_THREADS:
1991       g_value_set_int (value, ffmpegdec->max_threads);
1992       break;
1993     case PROP_OUTPUT_CORRUPT:
1994       g_value_set_boolean (value, ffmpegdec->output_corrupt);
1995       break;
1996     default:
1997       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1998       break;
1999   }
2000 }
2001
2002 gboolean
2003 gst_ffmpegviddec_register (GstPlugin * plugin)
2004 {
2005   GTypeInfo typeinfo = {
2006     sizeof (GstFFMpegVidDecClass),
2007     (GBaseInitFunc) gst_ffmpegviddec_base_init,
2008     NULL,
2009     (GClassInitFunc) gst_ffmpegviddec_class_init,
2010     NULL,
2011     NULL,
2012     sizeof (GstFFMpegVidDec),
2013     0,
2014     (GInstanceInitFunc) gst_ffmpegviddec_init,
2015   };
2016   GType type;
2017   AVCodec *in_plugin;
2018   gint rank;
2019
2020   in_plugin = av_codec_next (NULL);
2021
2022   GST_LOG ("Registering decoders");
2023
2024   while (in_plugin) {
2025     gchar *type_name;
2026     gchar *plugin_name;
2027
2028     /* only video decoders */
2029     if (!av_codec_is_decoder (in_plugin)
2030         || in_plugin->type != AVMEDIA_TYPE_VIDEO)
2031       goto next;
2032
2033     /* no quasi-codecs, please */
2034     if (in_plugin->id == AV_CODEC_ID_RAWVIDEO ||
2035         in_plugin->id == AV_CODEC_ID_V210 ||
2036         in_plugin->id == AV_CODEC_ID_V210X ||
2037         in_plugin->id == AV_CODEC_ID_R210 ||
2038         (in_plugin->id >= AV_CODEC_ID_PCM_S16LE &&
2039             in_plugin->id <= AV_CODEC_ID_PCM_BLURAY)) {
2040       goto next;
2041     }
2042
2043     /* No decoders depending on external libraries (we don't build them, but
2044      * people who build against an external ffmpeg might have them.
2045      * We have native gstreamer plugins for all of those libraries anyway. */
2046     if (!strncmp (in_plugin->name, "lib", 3)) {
2047       GST_DEBUG
2048           ("Not using external library decoder %s. Use the gstreamer-native ones instead.",
2049           in_plugin->name);
2050       goto next;
2051     }
2052
2053     /* No vdpau plugins until we can figure out how to properly use them
2054      * outside of ffmpeg. */
2055     if (g_str_has_suffix (in_plugin->name, "_vdpau")) {
2056       GST_DEBUG
2057           ("Ignoring VDPAU decoder %s. We can't handle this outside of ffmpeg",
2058           in_plugin->name);
2059       goto next;
2060     }
2061
2062     if (g_str_has_suffix (in_plugin->name, "_xvmc")) {
2063       GST_DEBUG
2064           ("Ignoring XVMC decoder %s. We can't handle this outside of ffmpeg",
2065           in_plugin->name);
2066       goto next;
2067     }
2068
2069     GST_DEBUG ("Trying plugin %s [%s]", in_plugin->name, in_plugin->long_name);
2070
2071     /* no codecs for which we're GUARANTEED to have better alternatives */
2072     /* MPEG1VIDEO : the mpeg2video decoder is preferred */
2073     /* MP1 : Use MP3 for decoding */
2074     /* MP2 : Use MP3 for decoding */
2075     /* Theora: Use libtheora based theoradec */
2076     if (!strcmp (in_plugin->name, "gif") ||
2077         !strcmp (in_plugin->name, "theora") ||
2078         !strcmp (in_plugin->name, "mpeg1video") ||
2079         strstr (in_plugin->name, "crystalhd") != NULL ||
2080         !strcmp (in_plugin->name, "ass") ||
2081         !strcmp (in_plugin->name, "srt") ||
2082         !strcmp (in_plugin->name, "pgssub") ||
2083         !strcmp (in_plugin->name, "dvdsub") ||
2084         !strcmp (in_plugin->name, "dvbsub")) {
2085       GST_LOG ("Ignoring decoder %s", in_plugin->name);
2086       goto next;
2087     }
2088
2089     /* construct the type */
2090     if (!strcmp (in_plugin->name, "hevc")) {
2091       plugin_name = g_strdup ("h265");
2092     } else {
2093       plugin_name = g_strdup ((gchar *) in_plugin->name);
2094     }
2095     g_strdelimit (plugin_name, NULL, '_');
2096     type_name = g_strdup_printf ("avdec_%s", plugin_name);
2097     g_free (plugin_name);
2098
2099     type = g_type_from_name (type_name);
2100
2101     if (!type) {
2102       /* create the gtype now */
2103       type =
2104           g_type_register_static (GST_TYPE_VIDEO_DECODER, type_name, &typeinfo,
2105           0);
2106       g_type_set_qdata (type, GST_FFDEC_PARAMS_QDATA, (gpointer) in_plugin);
2107     }
2108
2109     /* (Ronald) MPEG-4 gets a higher priority because it has been well-
2110      * tested and by far outperforms divxdec/xviddec - so we prefer it.
2111      * msmpeg4v3 same, as it outperforms divxdec for divx3 playback.
2112      * VC1/WMV3 are not working and thus unpreferred for now. */
2113     switch (in_plugin->id) {
2114       case AV_CODEC_ID_MPEG4:
2115       case AV_CODEC_ID_MSMPEG4V3:
2116       case AV_CODEC_ID_H264:
2117       case AV_CODEC_ID_HEVC:
2118       case AV_CODEC_ID_RV10:
2119       case AV_CODEC_ID_RV20:
2120       case AV_CODEC_ID_RV30:
2121       case AV_CODEC_ID_RV40:
2122         rank = GST_RANK_PRIMARY;
2123         break;
2124         /* DVVIDEO: we have a good dv decoder, fast on both ppc as well as x86.
2125          * They say libdv's quality is better though. leave as secondary.
2126          * note: if you change this, see the code in gstdv.c in good/ext/dv.
2127          */
2128       case AV_CODEC_ID_DVVIDEO:
2129         rank = GST_RANK_SECONDARY;
2130         break;
2131       default:
2132         rank = GST_RANK_MARGINAL;
2133         break;
2134     }
2135     if (!gst_element_register (plugin, type_name, rank, type)) {
2136       g_warning ("Failed to register %s", type_name);
2137       g_free (type_name);
2138       return FALSE;
2139     }
2140
2141     g_free (type_name);
2142
2143   next:
2144     in_plugin = av_codec_next (in_plugin);
2145   }
2146
2147   GST_LOG ("Finished Registering decoders");
2148
2149   return TRUE;
2150 }