mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-09 10:59:39 +00:00
decoder: add new "decoder-unit" object.
Introduce GstVaapiDecoderUnit which represents a fragment of the source stream to be decoded. For instance, a decode-unit will be a NAL unit for H.264 streams, an EBDU for VC-1 streams, and a video packet for MPEG-2 streams. This is a libgstvaapi internal object.
This commit is contained in:
parent
74533de9c6
commit
49dbb9af50
3 changed files with 326 additions and 0 deletions
|
@ -49,6 +49,7 @@ libgstvaapi_source_c = \
|
|||
gstvaapidecoder_mpeg2.c \
|
||||
gstvaapidecoder_mpeg4.c \
|
||||
gstvaapidecoder_objects.c \
|
||||
gstvaapidecoder_unit.c \
|
||||
gstvaapidecoder_vc1.c \
|
||||
gstvaapidisplay.c \
|
||||
gstvaapidisplaycache.c \
|
||||
|
@ -105,6 +106,7 @@ libgstvaapi_source_priv_h = \
|
|||
gstvaapidecoder_dpb.h \
|
||||
gstvaapidecoder_objects.h \
|
||||
gstvaapidecoder_priv.h \
|
||||
gstvaapidecoder_unit.h \
|
||||
gstvaapidisplay_priv.h \
|
||||
gstvaapiminiobject.h \
|
||||
gstvaapiobject_priv.h \
|
||||
|
|
149
gst-libs/gst/vaapi/gstvaapidecoder_unit.c
Normal file
149
gst-libs/gst/vaapi/gstvaapidecoder_unit.c
Normal file
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
* gstvaapidecoder_unit.c - VA decoder units
|
||||
*
|
||||
* Copyright (C) 2012 Intel Corporation
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:gstvaapidecoder_unit
|
||||
* @short_description: Decoder unit
|
||||
*/
|
||||
|
||||
#include "sysdeps.h"
|
||||
#include "gstvaapidecoder_unit.h"
|
||||
|
||||
static inline const GstVaapiMiniObjectClass *
|
||||
gst_vaapi_decoder_unit_class(void)
|
||||
{
|
||||
static const GstVaapiMiniObjectClass GstVaapiDecoderUnitClass = {
|
||||
sizeof(GstVaapiDecoderUnit),
|
||||
(GDestroyNotify)gst_vaapi_decoder_unit_finalize
|
||||
};
|
||||
return &GstVaapiDecoderUnitClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_vaapi_decoder_unit_init:
|
||||
* @unit: a #GstVaapiDecoderUnit
|
||||
*
|
||||
* Initializes internal resources bound to the supplied decoder @unit.
|
||||
*
|
||||
* @note This is an internal function used to implement lightweight
|
||||
* sub-classes.
|
||||
*/
|
||||
static inline void
|
||||
decoder_unit_init(GstVaapiDecoderUnit *unit, guint size)
|
||||
{
|
||||
unit->size = size;
|
||||
unit->offset = 0;
|
||||
unit->buffer = NULL;
|
||||
|
||||
unit->parsed_info = NULL;
|
||||
unit->parsed_info_destroy_notify = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
gst_vaapi_decoder_unit_init(GstVaapiDecoderUnit *unit, guint size)
|
||||
{
|
||||
decoder_unit_init(unit, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_vaapi_decoder_unit_finalize:
|
||||
* @unit: a #GstVaapiDecoderUnit
|
||||
*
|
||||
* Deallocates any internal resources bound to the supplied decoder
|
||||
* @unit.
|
||||
*
|
||||
* @note This is an internal function used to implement lightweight
|
||||
* sub-classes.
|
||||
*/
|
||||
static inline void
|
||||
decoder_unit_finalize(GstVaapiDecoderUnit *unit)
|
||||
{
|
||||
gst_buffer_replace(&unit->buffer, NULL);
|
||||
gst_vaapi_decoder_unit_set_parsed_info(unit, NULL, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
gst_vaapi_decoder_unit_finalize(GstVaapiDecoderUnit *unit)
|
||||
{
|
||||
decoder_unit_finalize(unit);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_vaapi_decoder_unit_new:
|
||||
* @size: size in bytes of this bitstream data chunk
|
||||
*
|
||||
* Creates a new #GstVaapiDecoderUnit object.
|
||||
*
|
||||
* Returns: The newly allocated #GstVaapiDecoderUnit
|
||||
*/
|
||||
GstVaapiDecoderUnit *
|
||||
gst_vaapi_decoder_unit_new(guint size)
|
||||
{
|
||||
GstVaapiDecoderUnit *unit;
|
||||
|
||||
unit = (GstVaapiDecoderUnit *)
|
||||
gst_vaapi_mini_object_new(gst_vaapi_decoder_unit_class());
|
||||
if (!unit)
|
||||
return NULL;
|
||||
|
||||
decoder_unit_init(unit, size);
|
||||
return unit;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_vaapi_decoder_unit_set_buffer:
|
||||
* @unit: a #GstVaapiDecoderUnit
|
||||
* @buffer: the new #GstBuffer to set
|
||||
*
|
||||
* Sets new buffer to the supplied decoder unit. The @unit holds an
|
||||
* extra reference to the @buffer if it is not NULL.
|
||||
*/
|
||||
void
|
||||
gst_vaapi_decoder_unit_set_buffer(GstVaapiDecoderUnit *unit, GstBuffer *buffer)
|
||||
{
|
||||
g_return_if_fail(GST_VAAPI_IS_DECODER_UNIT(unit));
|
||||
|
||||
gst_buffer_replace(&unit->buffer, buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_vaapi_decoder_unit_set_parsed_info:
|
||||
* @unit: a #GstVaapiDecoderUnit
|
||||
* @parsed_info: parser info
|
||||
* @destroy_notify: (closure parsed_info): a #GDestroyNotify
|
||||
*
|
||||
* Sets @parsed_info on the object and the #GDestroyNotify that will be
|
||||
* called when the data is freed.
|
||||
*
|
||||
* If some @parsed_info was previously set, then the former @destroy_notify
|
||||
* function will be called before the @parsed_info is replaced.
|
||||
*/
|
||||
void
|
||||
gst_vaapi_decoder_unit_set_parsed_info(GstVaapiDecoderUnit *unit,
|
||||
gpointer parsed_info, GDestroyNotify destroy_notify)
|
||||
{
|
||||
g_return_if_fail(GST_VAAPI_IS_DECODER_UNIT(unit));
|
||||
|
||||
if (unit->parsed_info && unit->parsed_info_destroy_notify)
|
||||
unit->parsed_info_destroy_notify(unit->parsed_info);
|
||||
unit->parsed_info = parsed_info;
|
||||
unit->parsed_info_destroy_notify = destroy_notify;
|
||||
}
|
175
gst-libs/gst/vaapi/gstvaapidecoder_unit.h
Normal file
175
gst-libs/gst/vaapi/gstvaapidecoder_unit.h
Normal file
|
@ -0,0 +1,175 @@
|
|||
/*
|
||||
* gstvaapidecoder_unit.h - VA decoder units
|
||||
*
|
||||
* Copyright (C) 2012 Intel Corporation
|
||||
*
|
||||
* 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_VAAPI_DECODER_UNIT_H
|
||||
#define GST_VAAPI_DECODER_UNIT_H
|
||||
|
||||
#include <gst/gstbuffer.h>
|
||||
#include <gst/vaapi/gstvaapiminiobject.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _GstVaapiDecoderUnit GstVaapiDecoderUnit;
|
||||
|
||||
#define GST_VAAPI_DECODER_UNIT(unit) \
|
||||
((GstVaapiDecoderUnit *)(unit))
|
||||
|
||||
#define GST_VAAPI_IS_DECODER_UNIT(unit) \
|
||||
(GST_VAAPI_DECODER_UNIT(unit) != NULL)
|
||||
|
||||
/**
|
||||
* GstVaapiDecoderUnitFlags:
|
||||
* @GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START: marks the start of a frame.
|
||||
* @GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END: marks the end of a frame.
|
||||
* @GST_VAAPI_DECODER_UNIT_FLAG_STREAM_END: marks the end of a stream.
|
||||
* @GST_VAAPI_DECODER_UNIT_FLAG_SLICE: marks the unit contains slice data.
|
||||
* @GST_VAAPI_DECODER_UNIT_FLAG_SKIP: marks the unit as unused/skipped.
|
||||
*
|
||||
* Flags for #GstVaapiDecoderUnit.
|
||||
*/
|
||||
typedef enum {
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START = (1 << 0),
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END = (1 << 1),
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_STREAM_END = (1 << 2),
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_SLICE = (1 << 3),
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_SKIP = (1 << 4),
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_LAST = (1 << 5)
|
||||
} GstVaapiDecoderUnitFlags;
|
||||
|
||||
#define GST_VAAPI_DECODER_UNIT_FLAGS GST_VAAPI_MINI_OBJECT_FLAGS
|
||||
#define GST_VAAPI_DECODER_UNIT_FLAG_IS_SET GST_VAAPI_MINI_OBJECT_FLAG_IS_SET
|
||||
#define GST_VAAPI_DECODER_UNIT_FLAG_SET GST_VAAPI_MINI_OBJECT_FLAG_SET
|
||||
#define GST_VAAPI_DECODER_UNIT_FLAG_UNSET GST_VAAPI_MINI_OBJECT_FLAG_UNSET
|
||||
|
||||
/**
|
||||
* GST_VAAPI_DECODER_UNIT_IS_FRAME_START:
|
||||
* @unit: a #GstVaapiDecoderUnit
|
||||
*
|
||||
* Tests if the decoder unit marks the start of a frame.
|
||||
*
|
||||
* The start of a frame is codec dependent but it may include any new
|
||||
* sequence header.
|
||||
*/
|
||||
#define GST_VAAPI_DECODER_UNIT_IS_FRAME_START(unit) \
|
||||
(GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit, \
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START))
|
||||
|
||||
/**
|
||||
* GST_VAAPI_DECODER_UNIT_IS_FRAME_END:
|
||||
* @unit: a #GstVaapiDecoderUnit
|
||||
*
|
||||
* Tests if the decoder unit marks the end of a frame.
|
||||
*
|
||||
* The end of a frame is codec dependent but it is usually represented
|
||||
* by the last bitstream chunk that holds valid slice data.
|
||||
*/
|
||||
#define GST_VAAPI_DECODER_UNIT_IS_FRAME_END(unit) \
|
||||
(GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit, \
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END))
|
||||
|
||||
/**
|
||||
* GST_VAAPI_DECODER_UNIT_IS_STREAM_END:
|
||||
* @unit: a #GstVaapiDecoderUnit
|
||||
*
|
||||
* Tests if the decoder unit marks the end of the stream.
|
||||
*/
|
||||
#define GST_VAAPI_DECODER_UNIT_IS_STREAM_END(unit) \
|
||||
(GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit, \
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_STREAM_END))
|
||||
|
||||
/**
|
||||
* GST_VAAPI_DECODER_UNIT_IS_SLICE:
|
||||
* @unit: a #GstVaapiDecoderUnit
|
||||
*
|
||||
* Tests if the decoder unit contains slice data.
|
||||
*/
|
||||
#define GST_VAAPI_DECODER_UNIT_IS_SLICE(unit) \
|
||||
(GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit, \
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_SLICE))
|
||||
|
||||
/**
|
||||
* GST_VAAPI_DECODER_UNIT_IS_SKIPPED:
|
||||
* @unit: a #GstVaapiDecoderUnit
|
||||
*
|
||||
* Tests if the decoder unit is not needed for decoding an can be skipped.
|
||||
* i.e. #GstVaapiDecoder sub-classes won't see this chunk of bitstream
|
||||
* data.
|
||||
*/
|
||||
#define GST_VAAPI_DECODER_UNIT_IS_SKIPPED(unit) \
|
||||
(GST_VAAPI_DECODER_UNIT_FLAG_IS_SET(unit, \
|
||||
GST_VAAPI_DECODER_UNIT_FLAG_SKIP))
|
||||
|
||||
/**
|
||||
* GstVaapiDecoderUnit:
|
||||
* @size: size in bytes of this bitstream unit
|
||||
* @offset: relative offset in bytes to bitstream unit within the
|
||||
* associated #GstVideoCodecFrame input_buffer
|
||||
* @buffer: (optional) associated buffer or sub-buffer
|
||||
* @parsed_info: parser-specific data (this is codec specific)
|
||||
* @parsed_info_destroy_notify: function used to release @parsed_info data
|
||||
*
|
||||
* A chunk of bitstream data that was parsed.
|
||||
*/
|
||||
struct _GstVaapiDecoderUnit {
|
||||
/*< private >*/
|
||||
GstVaapiMiniObject parent_instance;
|
||||
|
||||
guint size;
|
||||
guint offset;
|
||||
GstBuffer *buffer;
|
||||
gpointer parsed_info;
|
||||
GDestroyNotify parsed_info_destroy_notify;
|
||||
};
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
void
|
||||
gst_vaapi_decoder_unit_init(GstVaapiDecoderUnit *unit, guint size);
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
void
|
||||
gst_vaapi_decoder_unit_finalize(GstVaapiDecoderUnit *unit);
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
GstVaapiDecoderUnit *
|
||||
gst_vaapi_decoder_unit_new(guint size);
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
void
|
||||
gst_vaapi_decoder_unit_set_buffer(GstVaapiDecoderUnit *unit, GstBuffer *buffer);
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
void
|
||||
gst_vaapi_decoder_unit_set_parsed_info(GstVaapiDecoderUnit *unit,
|
||||
gpointer parsed_info, GDestroyNotify destroy_notify);
|
||||
|
||||
#define gst_vaapi_decoder_unit_ref(unit) \
|
||||
gst_vaapi_mini_object_ref(GST_VAAPI_MINI_OBJECT(unit))
|
||||
|
||||
#define gst_vaapi_decoder_unit_unref(unit) \
|
||||
gst_vaapi_mini_object_unref(GST_VAAPI_MINI_OBJECT(unit))
|
||||
|
||||
#define gst_vaapi_decoder_unit_replace(old_unit_p, new_unit) \
|
||||
gst_vaapi_mini_object_replace((GstVaapiMiniObject **)(old_unit_p), \
|
||||
(GstVaapiMiniObject *)(new_unit))
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* GST_VAAPI_DECODER_UNIT_H */
|
Loading…
Reference in a new issue