diff options
author | Wind Yuan <feng.yuan@intel.com> | 2013-07-29 13:34:06 +0800 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2013-11-24 16:52:05 +0100 |
commit | 8174a3573771f8110b27892335ecee7bf8299f49 (patch) | |
tree | 6f97ce38949e2973de653d318b6de53b0756c148 /gst-libs/gst/vaapi/gstvaapiencoder_priv.h | |
parent | 99947d05926a2d540b9b071e15b060ebe5411f7b (diff) | |
download | gst-vaapi-8174a3573771f8110b27892335ecee7bf8299f49.tar.gz |
Add initial infrastructure for video encoding.
Add initial API for video encoding: only basic interfaces and small
encoder objects are implemented so far.
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
Diffstat (limited to 'gst-libs/gst/vaapi/gstvaapiencoder_priv.h')
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapiencoder_priv.h | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_priv.h b/gst-libs/gst/vaapi/gstvaapiencoder_priv.h new file mode 100644 index 00000000..71fff0cd --- /dev/null +++ b/gst-libs/gst/vaapi/gstvaapiencoder_priv.h @@ -0,0 +1,188 @@ +/* + * gstvaapiencoder_priv.h - VA encoder abstraction (private definitions) + * + * Copyright (C) 2013 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_ENCODER_PRIV_H +#define GST_VAAPI_ENCODER_PRIV_H + +#include <gst/vaapi/gstvaapiencoder.h> +#include <gst/vaapi/gstvaapiencoder_objects.h> +#include <gst/vaapi/gstvaapicontext.h> +#include <gst/video/gstvideoutils.h> + +G_BEGIN_DECLS + +#define GST_VAAPI_ENCODER_CLASS(klass) \ + ((GstVaapiEncoderClass *)(klass)) + +#define GST_IS_VAAPI_ENCODER_CLASS(klass) \ + ((klass) != NULL) + +#define GST_VAAPI_ENCODER_GET_CLASS(obj) \ + GST_VAAPI_ENCODER_CLASS(GST_VAAPI_MINI_OBJECT_GET_CLASS(obj)) + +/* Get GstVaapiDisplay* */ +#define GST_VAAPI_ENCODER_DISPLAY(encoder) \ + (GST_VAAPI_ENCODER_CAST(encoder)->display) + +/* Get VADisplay */ +#define GST_VAAPI_ENCODER_VA_DISPLAY(encoder) \ + (GST_VAAPI_ENCODER_CAST(encoder)->va_display) + +/* Get GstVaapiContext* */ +#define GST_VAAPI_ENCODER_CONTEXT(encoder) \ + (GST_VAAPI_ENCODER_CAST(encoder)->context) + +/* Get VAContext */ +#define GST_VAAPI_ENCODER_VA_CONTEXT(encoder) \ + (GST_VAAPI_ENCODER_CAST(encoder)->va_context) + +#define GST_VAAPI_ENCODER_VIDEO_INFO(encoder) (GST_VAAPI_ENCODER_CAST(encoder)->video_info) +#define GST_VAAPI_ENCODER_CAPS(encoder) (GST_VAAPI_ENCODER_CAST(encoder)->caps) +#define GST_VAAPI_ENCODER_WIDTH(encoder) (GST_VAAPI_ENCODER_CAST(encoder)->video_info.width) +#define GST_VAAPI_ENCODER_HEIGHT(encoder) (GST_VAAPI_ENCODER_CAST(encoder)->video_info.height) +#define GST_VAAPI_ENCODER_FPS_N(encoder) (GST_VAAPI_ENCODER_CAST(encoder)->video_info.fps_n) +#define GST_VAAPI_ENCODER_FPS_D(encoder) (GST_VAAPI_ENCODER_CAST(encoder)->video_info.fps_d) +#define GST_VAAPI_ENCODER_RATE_CONTROL(encoder) \ + (GST_VAAPI_ENCODER_CAST(encoder)->rate_control) + +#define GST_VAAPI_ENCODER_LOG_ERROR(...) GST_ERROR( __VA_ARGS__) +#define GST_VAAPI_ENCODER_LOG_WARNING(...) GST_WARNING( __VA_ARGS__) +#define GST_VAAPI_ENCODER_LOG_DEBUG(...) GST_DEBUG( __VA_ARGS__) +#define GST_VAAPI_ENCODER_LOG_INFO(...) GST_INFO( __VA_ARGS__) + +#define GST_VAAPI_ENCODER_CHECK_STATUS(exp, err_num, err_reason, ...) \ + if (!(exp)) { \ + ret = err_num; \ + GST_VAAPI_ENCODER_LOG_ERROR(err_reason, ## __VA_ARGS__); \ + goto end; \ + } + +typedef struct _GstVaapiCodedBufferProxyClass GstVaapiCodedBufferProxyClass; +typedef struct _GstVaapiEncoderClass GstVaapiEncoderClass; + +struct _GstVaapiEncoder +{ + /*< private > */ + GstVaapiMiniObject parent_instance; + + GstVaapiDisplay *display; + GstVaapiContext *context; + GstCaps *caps; + + VADisplay va_display; + VAContextID va_context; + GstVideoInfo video_info; + GstVaapiRateControl rate_control; + + guint buf_count; + guint max_buf_num; + guint buf_size; + GMutex lock; + GCond codedbuf_free; + GCond surface_free; + GQueue coded_buffers; + + /* queue for sync */ + GQueue sync_pictures; + GCond sync_ready; +}; + +struct _GstVaapiEncoderClass +{ + GObjectClass parent_class; + + gboolean (*init) (GstVaapiEncoder * encoder); + void (*destroy) (GstVaapiEncoder * encoder); + + GstCaps * (*set_format) (GstVaapiEncoder * encoder, + GstVideoCodecState * in_state, + GstCaps * ref_caps); + + gboolean (*get_context_info) (GstVaapiEncoder * encoder, + GstVaapiContextInfo * info); + + GstVaapiEncoderStatus (*reordering) (GstVaapiEncoder * encoder, + GstVideoCodecFrame * in, + gboolean flush, + GstVaapiEncPicture ** out); + GstVaapiEncoderStatus (*encode) (GstVaapiEncoder * encoder, + GstVaapiEncPicture * picture, + GstVaapiCodedBufferProxy * codedbuf); + + GstVaapiEncoderStatus (*flush) (GstVaapiEncoder * encoder); + + /* get_codec_data can be NULL */ + GstVaapiEncoderStatus (*get_codec_data) (GstVaapiEncoder * encoder, + GstBuffer ** codec_data); +}; + +struct _GstVaapiCodedBufferProxy +{ + /*< private >*/ + GstVaapiMiniObject parent_instance; + GstVaapiEncoder *encoder; + + /*< public >*/ + GstVaapiCodedBuffer *buffer; +}; + +struct _GstVaapiCodedBufferProxyClass +{ + GstVaapiMiniObjectClass parent_class; +}; + +void +gst_vaapi_encoder_class_init (GstVaapiEncoderClass * klass); + +GstVaapiEncoder * +gst_vaapi_encoder_new (const GstVaapiEncoderClass * klass, + GstVaapiDisplay * display); + +void +gst_vaapi_encoder_finalize (GstVaapiEncoder * encoder); + +GstVaapiSurfaceProxy * +gst_vaapi_encoder_create_surface (GstVaapiEncoder * + encoder); + +void +gst_vaapi_encoder_release_surface (GstVaapiEncoder * encoder, + GstVaapiSurfaceProxy * surface); + +/* ------------------ GstVaapiCodedBufferProxy ---------------------------- */ + +GstVaapiCodedBufferProxy * +gst_vaapi_coded_buffer_proxy_new (GstVaapiEncoder * + encoder); + +GstVaapiCodedBufferProxy * +gst_vaapi_coded_buffer_proxy_ref (GstVaapiCodedBufferProxy * proxy); + +void +gst_vaapi_coded_buffer_proxy_unref (GstVaapiCodedBufferProxy * proxy); + +void +gst_vaapi_coded_buffer_proxy_replace (GstVaapiCodedBufferProxy ** old_proxy_ptr, + GstVaapiCodedBufferProxy * new_proxy); + +G_END_DECLS + +#endif /* GST_VAAPI_ENCODER_PRIV_H */ |