mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-26 17:18:15 +00:00
surfaceproxy: add more attributes for raw decoding modes.
Add more attributes for raw decoding modes, i.e. directly through the libgstvaapi helper library. In particular, add presentation timestamp, duration and a couple of flags (interlaced, TFF, RFF, one-field).
This commit is contained in:
parent
0bd929dfa2
commit
c7dff071c7
5 changed files with 225 additions and 26 deletions
|
@ -521,8 +521,11 @@ GST_VAAPI_DECODER_VC1_GET_CLASS
|
||||||
<SECTION>
|
<SECTION>
|
||||||
<FILE>gstvaapisurfaceproxy</FILE>
|
<FILE>gstvaapisurfaceproxy</FILE>
|
||||||
<TITLE>GstVaapiSurfaceProxy</TITLE>
|
<TITLE>GstVaapiSurfaceProxy</TITLE>
|
||||||
|
gst_vaapi_surface_proxy_get_duration
|
||||||
|
gst_vaapi_surface_proxy_get_flags
|
||||||
gst_vaapi_surface_proxy_get_surface
|
gst_vaapi_surface_proxy_get_surface
|
||||||
gst_vaapi_surface_proxy_get_surface_id
|
gst_vaapi_surface_proxy_get_surface_id
|
||||||
|
gst_vaapi_surface_proxy_get_timestamp
|
||||||
gst_vaapi_surface_proxy_new_from_pool
|
gst_vaapi_surface_proxy_new_from_pool
|
||||||
gst_vaapi_surface_proxy_ref
|
gst_vaapi_surface_proxy_ref
|
||||||
gst_vaapi_surface_proxy_replace
|
gst_vaapi_surface_proxy_replace
|
||||||
|
|
|
@ -113,6 +113,7 @@ libgstvaapi_source_priv_h = \
|
||||||
gstvaapiminiobject.h \
|
gstvaapiminiobject.h \
|
||||||
gstvaapiobject_priv.h \
|
gstvaapiobject_priv.h \
|
||||||
gstvaapisurface_priv.h \
|
gstvaapisurface_priv.h \
|
||||||
|
gstvaapisurfaceproxy_priv.h \
|
||||||
gstvaapiutils.h \
|
gstvaapiutils.h \
|
||||||
gstvaapiversion.h \
|
gstvaapiversion.h \
|
||||||
gstvaapiworkarounds.h \
|
gstvaapiworkarounds.h \
|
||||||
|
|
|
@ -27,28 +27,11 @@
|
||||||
|
|
||||||
#include "sysdeps.h"
|
#include "sysdeps.h"
|
||||||
#include "gstvaapisurfaceproxy.h"
|
#include "gstvaapisurfaceproxy.h"
|
||||||
#include "gstvaapiobject_priv.h"
|
#include "gstvaapisurfaceproxy_priv.h"
|
||||||
#include "gstvaapiminiobject.h"
|
|
||||||
|
|
||||||
#define DEBUG 1
|
#define DEBUG 1
|
||||||
#include "gstvaapidebug.h"
|
#include "gstvaapidebug.h"
|
||||||
|
|
||||||
#define GST_VAAPI_SURFACE_PROXY(obj) \
|
|
||||||
((GstVaapiSurfaceProxy *)(obj))
|
|
||||||
|
|
||||||
#define GST_VAAPI_IS_SURFACE_PROXY(obj) \
|
|
||||||
(GST_VAAPI_SURFACE_PROXY(obj) != NULL)
|
|
||||||
|
|
||||||
struct _GstVaapiSurfaceProxy {
|
|
||||||
/*< private >*/
|
|
||||||
GstVaapiMiniObject parent_instance;
|
|
||||||
|
|
||||||
GstVaapiVideoPool *pool;
|
|
||||||
GstVaapiSurface *surface;
|
|
||||||
GDestroyNotify destroy_func;
|
|
||||||
gpointer destroy_data;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_vaapi_surface_proxy_finalize(GstVaapiSurfaceProxy *proxy)
|
gst_vaapi_surface_proxy_finalize(GstVaapiSurfaceProxy *proxy)
|
||||||
{
|
{
|
||||||
|
@ -90,6 +73,8 @@ gst_vaapi_surface_proxy_new_from_pool(GstVaapiSurfacePool *pool)
|
||||||
proxy->surface = gst_vaapi_video_pool_get_object(proxy->pool);
|
proxy->surface = gst_vaapi_video_pool_get_object(proxy->pool);
|
||||||
if (!proxy->surface)
|
if (!proxy->surface)
|
||||||
goto error;
|
goto error;
|
||||||
|
proxy->timestamp = GST_CLOCK_TIME_NONE;
|
||||||
|
proxy->duration = GST_CLOCK_TIME_NONE;
|
||||||
proxy->destroy_func = NULL;
|
proxy->destroy_func = NULL;
|
||||||
g_object_ref(proxy->surface);
|
g_object_ref(proxy->surface);
|
||||||
return proxy;
|
return proxy;
|
||||||
|
@ -163,7 +148,24 @@ gst_vaapi_surface_proxy_get_surface(GstVaapiSurfaceProxy *proxy)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), NULL);
|
g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), NULL);
|
||||||
|
|
||||||
return proxy->surface;
|
return GST_VAAPI_SURFACE_PROXY_SURFACE(proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_surface_proxy_get_flags:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Returns the #GstVaapiSurfaceProxyFlags associated with this surface
|
||||||
|
* @proxy.
|
||||||
|
*
|
||||||
|
* Return value: the set of #GstVaapiSurfaceProxyFlags
|
||||||
|
*/
|
||||||
|
guint
|
||||||
|
gst_vaapi_surface_proxy_get_flags(GstVaapiSurfaceProxy *proxy)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), 0);
|
||||||
|
|
||||||
|
return GST_VAAPI_SURFACE_PROXY_FLAGS(proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -180,7 +182,39 @@ gst_vaapi_surface_proxy_get_surface_id(GstVaapiSurfaceProxy *proxy)
|
||||||
g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), GST_VAAPI_ID_NONE);
|
g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), GST_VAAPI_ID_NONE);
|
||||||
g_return_val_if_fail(proxy->surface != NULL, GST_VAAPI_ID_NONE);
|
g_return_val_if_fail(proxy->surface != NULL, GST_VAAPI_ID_NONE);
|
||||||
|
|
||||||
return GST_VAAPI_OBJECT_ID(proxy->surface);
|
return GST_VAAPI_SURFACE_PROXY_SURFACE_ID(proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_surface_proxy_get_timestamp:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Returns the presentation timestamp for this surface @proxy.
|
||||||
|
*
|
||||||
|
* Return value: the presentation timestamp
|
||||||
|
*/
|
||||||
|
GstClockTime
|
||||||
|
gst_vaapi_surface_proxy_get_timestamp(GstVaapiSurfaceProxy *proxy)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), 0);
|
||||||
|
|
||||||
|
return GST_VAAPI_SURFACE_PROXY_TIMESTAMP(proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_surface_proxy_get_duration:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Returns the presentation duration for this surface @proxy.
|
||||||
|
*
|
||||||
|
* Return value: the presentation duration
|
||||||
|
*/
|
||||||
|
GstClockTime
|
||||||
|
gst_vaapi_surface_proxy_get_duration(GstVaapiSurfaceProxy *proxy)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), 0);
|
||||||
|
|
||||||
|
return GST_VAAPI_SURFACE_PROXY_DURATION(proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -29,13 +29,61 @@
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_VAAPI_SURFACE_PROXY_SURFACE:
|
* GstVaapiSurfaceProxyFlags:
|
||||||
* @surface: a #GstVaapiSurfaceProxy
|
* @GST_VAAPI_SURFACE_PROXY_FLAG_INTERLACED: interlaced frame
|
||||||
|
* @GST_VAAPI_SURFACE_PROXY_FLAG_TFF: top-field-first
|
||||||
|
* @GST_VAAPI_SURFACE_PROXY_FLAG_RFF: repeat-field-first
|
||||||
|
* @GST_VAAPI_SURFACE_PROXY_FLAG_ONEFIELD: only one field is available
|
||||||
|
* @GST_VAAPI_SURFACE_PROXY_FLAG_LAST: first flag that can be used by subclasses
|
||||||
*
|
*
|
||||||
* Macro that evaluates to the #GstVaapiSurface of @surface.
|
* Flags for #GstVaapiDecoderFrame.
|
||||||
*/
|
*/
|
||||||
#define GST_VAAPI_SURFACE_PROXY_SURFACE(surface) \
|
typedef enum {
|
||||||
gst_vaapi_surface_proxy_get_surface(surface)
|
GST_VAAPI_SURFACE_PROXY_FLAG_INTERLACED = (1 << 0),
|
||||||
|
GST_VAAPI_SURFACE_PROXY_FLAG_TFF = (1 << 1),
|
||||||
|
GST_VAAPI_SURFACE_PROXY_FLAG_RFF = (1 << 2),
|
||||||
|
GST_VAAPI_SURFACE_PROXY_FLAG_ONEFIELD = (1 << 3),
|
||||||
|
GST_VAAPI_SURFACE_PROXY_FLAG_LAST = (1 << 8)
|
||||||
|
} GstVaapiSurfaceProxyFlags;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VAAPI_SURFACE_PROXY_SURFACE:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Macro that evaluates to the #GstVaapiSurface of @proxy.
|
||||||
|
*/
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_SURFACE(proxy) \
|
||||||
|
gst_vaapi_surface_proxy_get_surface(proxy)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VAAPI_SURFACE_PROXY_SURFACE_ID:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Macro that evaluates to the VA surface ID of the underlying @proxy
|
||||||
|
* surface.
|
||||||
|
*/
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_SURFACE_ID(proxy) \
|
||||||
|
gst_vaapi_surface_proxy_get_surface_id(proxy)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VAAPI_SURFACE_PROXY_TIMESTAMP:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Macro that evaluates to the presentation timestamp of the
|
||||||
|
* underlying @proxy surface.
|
||||||
|
*/
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_TIMESTAMP(proxy) \
|
||||||
|
gst_vaapi_surface_proxy_get_timestamp(proxy)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VAAPI_SURFACE_PROXY_DURATION:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Macro that evaluates to the presentation duration of the
|
||||||
|
* underlying @proxy surface.
|
||||||
|
*/
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_DURATION(proxy) \
|
||||||
|
gst_vaapi_surface_proxy_get_duration(proxy)
|
||||||
|
|
||||||
GstVaapiSurfaceProxy *
|
GstVaapiSurfaceProxy *
|
||||||
gst_vaapi_surface_proxy_new_from_pool(GstVaapiSurfacePool *pool);
|
gst_vaapi_surface_proxy_new_from_pool(GstVaapiSurfacePool *pool);
|
||||||
|
@ -50,12 +98,21 @@ void
|
||||||
gst_vaapi_surface_proxy_replace(GstVaapiSurfaceProxy **old_proxy_ptr,
|
gst_vaapi_surface_proxy_replace(GstVaapiSurfaceProxy **old_proxy_ptr,
|
||||||
GstVaapiSurfaceProxy *new_proxy);
|
GstVaapiSurfaceProxy *new_proxy);
|
||||||
|
|
||||||
|
guint
|
||||||
|
gst_vaapi_surface_proxy_get_flags(GstVaapiSurfaceProxy *proxy);
|
||||||
|
|
||||||
GstVaapiSurface *
|
GstVaapiSurface *
|
||||||
gst_vaapi_surface_proxy_get_surface(GstVaapiSurfaceProxy *proxy);
|
gst_vaapi_surface_proxy_get_surface(GstVaapiSurfaceProxy *proxy);
|
||||||
|
|
||||||
GstVaapiID
|
GstVaapiID
|
||||||
gst_vaapi_surface_proxy_get_surface_id(GstVaapiSurfaceProxy *proxy);
|
gst_vaapi_surface_proxy_get_surface_id(GstVaapiSurfaceProxy *proxy);
|
||||||
|
|
||||||
|
GstClockTime
|
||||||
|
gst_vaapi_surface_proxy_get_timestamp(GstVaapiSurfaceProxy *proxy);
|
||||||
|
|
||||||
|
GstClockTime
|
||||||
|
gst_vaapi_surface_proxy_get_duration(GstVaapiSurfaceProxy *proxy);
|
||||||
|
|
||||||
void
|
void
|
||||||
gst_vaapi_surface_proxy_set_destroy_notify(GstVaapiSurfaceProxy *proxy,
|
gst_vaapi_surface_proxy_set_destroy_notify(GstVaapiSurfaceProxy *proxy,
|
||||||
GDestroyNotify destroy_func, gpointer user_data);
|
GDestroyNotify destroy_func, gpointer user_data);
|
||||||
|
|
104
gst-libs/gst/vaapi/gstvaapisurfaceproxy_priv.h
Normal file
104
gst-libs/gst/vaapi/gstvaapisurfaceproxy_priv.h
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
* gstvaapisurfaceproxy_priv.h - VA surface proxy (private definitions)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2011 Splitted-Desktop Systems
|
||||||
|
* Copyright (C) 2011-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_SURFACE_PROXY_PRIV_H
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_PRIV_H
|
||||||
|
|
||||||
|
#include "gstvaapiminiobject.h"
|
||||||
|
#include "gstvaapisurfaceproxy.h"
|
||||||
|
#include "gstvaapiobject_priv.h"
|
||||||
|
#include "gstvaapisurface_priv.h"
|
||||||
|
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY(obj) \
|
||||||
|
((GstVaapiSurfaceProxy *)(obj))
|
||||||
|
|
||||||
|
#define GST_VAAPI_IS_SURFACE_PROXY(obj) \
|
||||||
|
(GST_VAAPI_SURFACE_PROXY(obj) != NULL)
|
||||||
|
|
||||||
|
struct _GstVaapiSurfaceProxy {
|
||||||
|
/*< private >*/
|
||||||
|
GstVaapiMiniObject parent_instance;
|
||||||
|
|
||||||
|
GstVaapiVideoPool *pool;
|
||||||
|
GstVaapiSurface *surface;
|
||||||
|
GstClockTime timestamp;
|
||||||
|
GstClockTime duration;
|
||||||
|
GDestroyNotify destroy_func;
|
||||||
|
gpointer destroy_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_FLAGS GST_VAAPI_MINI_OBJECT_FLAGS
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_FLAG_IS_SET GST_VAAPI_MINI_OBJECT_FLAG_IS_SET
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_FLAG_SET GST_VAAPI_MINI_OBJECT_FLAG_SET
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_FLAG_UNSET GST_VAAPI_MINI_OBJECT_FLAG_UNSET
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VAAPI_SURFACE_PROXY_SURFACE:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Macro that evaluates to the #GstVaapiSurface of @proxy.
|
||||||
|
* This is an internal macro that does not do any run-time type check.
|
||||||
|
*/
|
||||||
|
#undef GST_VAAPI_SURFACE_PROXY_SURFACE
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_SURFACE(proxy) \
|
||||||
|
proxy->surface
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VAAPI_SURFACE_PROXY_SURFACE_ID:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Macro that evaluates to the VA surface ID of the underlying @proxy
|
||||||
|
* surface.
|
||||||
|
*
|
||||||
|
* This is an internal macro that does not do any run-time type check.
|
||||||
|
*/
|
||||||
|
#undef GST_VAAPI_SURFACE_PROXY_SURFACE_ID
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_SURFACE_ID(proxy) \
|
||||||
|
GST_VAAPI_OBJECT_ID(proxy->surface)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VAAPI_SURFACE_PROXY_TIMESTAMP:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Macro that evaluates to the presentation timestamp of the
|
||||||
|
* underlying @proxy surface.
|
||||||
|
*
|
||||||
|
* This is an internal macro that does not do any run-time type check.
|
||||||
|
*/
|
||||||
|
#undef GST_VAAPI_SURFACE_PROXY_TIMESTAMP
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_TIMESTAMP(proxy) \
|
||||||
|
proxy->timestamp
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VAAPI_SURFACE_PROXY_DURATION:
|
||||||
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
*
|
||||||
|
* Macro that evaluates to the presentation duration of the
|
||||||
|
* underlying @proxy surface.
|
||||||
|
*
|
||||||
|
* This is an internal macro that does not do any run-time type check.
|
||||||
|
*/
|
||||||
|
#undef GST_VAAPI_SURFACE_PROXY_DURATION
|
||||||
|
#define GST_VAAPI_SURFACE_PROXY_DURATION(proxy) \
|
||||||
|
proxy->duration
|
||||||
|
|
||||||
|
#endif /* GST_VAAPI_SURFACE_PROXY_PRIV_H */
|
Loading…
Reference in a new issue