gstreamer/gst/vaapi/gstvaapidecode.h
Sreerenj Balachandran 6eba201f32 vaapidecode: Rework the re-negotiation code to handle multi resoultion videos
Delaying the pool re-negotiation untill we push all decoded (and queued)
frames downstream. Otherwise for the multi-resolution videos, the
GstVideoVideoMemory will be having wrong resolution and which leads
to nasty behaviours, especially when using software renderers.

sample media file: RAP_B_Bossen_1.bin
case explained:
The first SPS Nal will report resoultion of 448x256 and having crop rectangles to
get the final resoultion 416x240.
Starting from 25 th frame, the resolution will change to 416x240. But parser
elements won't report this since the effective croped resolution is same in
both cases. Here the core libgstvaapi will detect this through it's internal
parsing and do all context/pool destory/reset stuffs. Also it will notify this
change to plugins in advance. But if the plugin try to do re-negotiaion of pool
immediately, this will not sync with the resolution of already decoded and queued
frames and which will lead to failure in gst_video_frame_map() in downstream(if we use the
software renderer). So we have to delay the pool renegotiation in vaapidecode,
untill we push all decoded frames downstream.

https://bugzilla.gnome.org/show_bug.cgi?id=753914
2015-08-29 00:18:57 +03:00

89 lines
3 KiB
C

/*
* gstvaapidecode.h - VA-API video decoder
*
* Copyright (C) 2010-2011 Splitted-Desktop Systems
* Author: Gwenole Beauchesne <gwenole.beauchesne@splitted-desktop.com>
* Copyright (C) 2011-2013 Intel Corporation
* Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
#ifndef GST_VAAPIDECODE_H
#define GST_VAAPIDECODE_H
#include "gstvaapipluginbase.h"
#include <gst/vaapi/gstvaapidecoder.h>
G_BEGIN_DECLS
#define GST_TYPE_VAAPIDECODE \
(gst_vaapidecode_get_type())
#define GST_VAAPIDECODE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \
GST_TYPE_VAAPIDECODE, \
GstVaapiDecode))
#define GST_VAAPIDECODE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_TYPE_VAAPIDECODE, \
GstVaapiDecodeClass))
#define GST_IS_VAAPIDECODE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_VAAPIDECODE))
#define GST_IS_VAAPIDECODE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_VAAPIDECODE))
#define GST_VAAPIDECODE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_TYPE_VAAPIDECODE, \
GstVaapiDecodeClass))
typedef struct _GstVaapiDecode GstVaapiDecode;
typedef struct _GstVaapiDecodeClass GstVaapiDecodeClass;
struct _GstVaapiDecode {
/*< private >*/
GstVaapiPluginBase parent_instance;
GstCaps *sinkpad_caps;
GstCaps *srcpad_caps;
GstVaapiDecoder *decoder;
GMutex surface_ready_mutex;
GCond surface_ready;
GstCaps *decoder_caps;
GstCaps *allowed_caps;
guint current_frame_size;
guint has_texture_upload_meta : 1;
GstVideoCodecState *input_state;
volatile gboolean active;
volatile gboolean do_renego;
};
struct _GstVaapiDecodeClass {
/*< private >*/
GstVaapiPluginBaseClass parent_class;
};
GType
gst_vaapidecode_get_type(void) G_GNUC_CONST;
G_END_DECLS
#endif /* GST_VAAPIDECODE_H */