1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee INTEL CONFIDENTIAL 3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Copyright 2009 Intel Corporation All Rights Reserved. 4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission. 5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing. 7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <va/va.h> /* libVA */ 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <X11/Xlib.h> 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <va/va_x11.h> 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideolog.h" 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixdisplayx11.h" 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoframe.h" 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixframemanager.h" 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideorenderparams.h" 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideorenderparams_internal.h" 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat.h" 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat_vc1.h" 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat_h264.h" 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat_mp42.h" 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsdec_vc1.h" 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsdec_h264.h" 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsdec_mp42.h" 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc.h" 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc_h264.h" 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc_mpeg4.h" 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc_preview.h" 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_h264.h" 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_mpeg4.h" 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_preview.h" 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideo.h" 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideo_private.h" 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define USE_OPAQUE_POINTER 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef USE_OPAQUE_POINTER 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_VIDEO_PRIVATE(mix) (MixVideoPrivate *)(mix->context) 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_VIDEO_PRIVATE(mix) MIX_VIDEO_GET_PRIVATE(mix) 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define CHECK_INIT(mix, priv) \ 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix) { \ 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; \ 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } \ 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEO(mix)) { \ 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Not MixVideo\n"); \ 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; \ 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } \ 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv = MIX_VIDEO_PRIVATE(mix); \ 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->initialized) { \ 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Not initialized\n"); \ 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOT_INIT; \ 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define CHECK_INIT_CONFIG(mix, priv) \ 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT(mix, priv); \ 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->configured) { \ 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Not configured\n"); \ 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOT_CONFIGURED; \ 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * default implementation of virtual methods 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_version_default(MixVideo * mix, guint * major, 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint * minor); 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_initialize_default(MixVideo * mix, MixCodecMode mode, 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoInitParams * init_params, MixDrmParams * drm_init_params); 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_deinitialize_default(MixVideo * mix); 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_default(MixVideo * mix, 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParams * config_params, MixDrmParams * drm_config_params); 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_config_default(MixVideo * mix, 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParams ** config_params); 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_decode_default(MixVideo * mix, MixBuffer * bufin[], 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint bufincnt, MixVideoDecodeParams * decode_params); 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_frame_default(MixVideo * mix, MixVideoFrame ** frame); 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_frame_default(MixVideo * mix, 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFrame * frame); 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_render_default(MixVideo * mix, 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoRenderParams * render_params, MixVideoFrame *frame); 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_encode_default(MixVideo * mix, MixBuffer * bufin[], 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint bufincnt, MixIOVec * iovout[], gint iovoutcnt, 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoEncodeParams * encode_params); 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_flush_default(MixVideo * mix); 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_eos_default(MixVideo * mix); 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_state_default(MixVideo * mix, MixState * state); 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_mixbuffer_default(MixVideo * mix, MixBuffer ** buf); 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_mixbuffer_default(MixVideo * mix, MixBuffer * buf); 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_max_coded_buffer_size_default (MixVideo * mix, guint *max_size); 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_video_finalize(GObject * obj); 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_decode(MixVideo * mix, 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsDec * config_params_dec, 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixDrmParams * drm_config_params); 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_encode(MixVideo * mix, 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsEnc * config_params_enc, 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixDrmParams * drm_config_params); 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeG_DEFINE_TYPE( MixVideo, mix_video, G_TYPE_OBJECT); 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_video_init(MixVideo * self) { 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = MIX_VIDEO_GET_PRIVATE(self); 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef USE_OPAQUE_POINTER 135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->context = priv; 136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->context = NULL; 138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* private structure initialization */ 141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_video_private_initialize(priv); 143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 145bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_video_class_init(MixVideoClass * klass) { 146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee GObjectClass *gobject_class = (GObjectClass *) klass; 147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gobject_class->finalize = mix_video_finalize; 149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Register and allocate the space the private structure for this object */ 151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_type_class_add_private(gobject_class, sizeof(MixVideoPrivate)); 152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->get_version_func = mix_video_get_version_default; 154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->initialize_func = mix_video_initialize_default; 155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->deinitialize_func = mix_video_deinitialize_default; 156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->configure_func = mix_video_configure_default; 157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->get_config_func = mix_video_get_config_default; 158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->decode_func = mix_video_decode_default; 159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->get_frame_func = mix_video_get_frame_default; 160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->release_frame_func = mix_video_release_frame_default; 161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->render_func = mix_video_render_default; 162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->encode_func = mix_video_encode_default; 163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->flush_func = mix_video_flush_default; 164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->eos_func = mix_video_eos_default; 165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->get_state_func = mix_video_get_state_default; 166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->get_mix_buffer_func = mix_video_get_mixbuffer_default; 167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->release_mix_buffer_func = mix_video_release_mixbuffer_default; 168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->get_max_coded_buffer_size_func = mix_video_get_max_coded_buffer_size_default; 169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 171bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideo *mix_video_new(void) { 172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideo *ret = g_object_new(MIX_TYPE_VIDEO, NULL); 174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 178bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_video_finalize(GObject * obj) { 179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* clean up here. */ 181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideo *mix = MIX_VIDEO(obj); 183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_video_deinitialize(mix); 184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 186bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideo * 187bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_video_ref(MixVideo * mix) { 188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return (MixVideo *) g_object_ref(G_OBJECT(mix)); 189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* private methods */ 192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIXUNREF(obj, unref) if(obj) { unref(obj); obj = NULL; } 194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 195bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_video_private_initialize(MixVideoPrivate* priv) { 196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->objlock = NULL; 197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->initialized = FALSE; 198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->configured = FALSE; 199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* libVA */ 201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->va_display = NULL; 202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->va_major_version = -1; 203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->va_major_version = -1; 204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* mix objects */ 206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->frame_manager = NULL; 207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->video_format = NULL; 208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->video_format_enc = NULL; //for encoding 209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->surface_pool = NULL; 210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->buffer_pool = NULL; 211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->codec_mode = MIX_CODEC_MODE_DECODE; 213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->init_params = NULL; 214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->drm_params = NULL; 215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->config_params = NULL; 216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 218bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_video_private_cleanup(MixVideoPrivate* priv) { 219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status; 221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv) { 223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (priv->video_format_enc) { 227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videofmtenc_deinitialize(priv->video_format_enc); 228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->frame_manager, mix_framemanager_unref) 231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->video_format, mix_videoformat_unref) 232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->video_format_enc, mix_videoformatenc_unref) 233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //for encoding 234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->buffer_pool, mix_bufferpool_unref) 235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->surface_pool, mix_surfacepool_unref) 236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* MIXUNREF(priv->init_params, mix_videoinitparams_unref) */ 237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->drm_params, mix_drmparams_unref) 238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->config_params, mix_videoconfigparams_unref) 239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* terminate libVA */ 241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (priv->va_display) { 242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaTerminate(priv->va_display); 243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaTerminate\n"); 244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) { 245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_W( "Failed vaTerminate\n"); 246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->va_display = NULL; 248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->init_params, mix_videoinitparams_unref) 252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->va_major_version = -1; 254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->va_major_version = -1; 255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (priv->objlock) { 257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_free(priv->objlock); 258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->objlock = NULL; 259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->codec_mode = MIX_CODEC_MODE_DECODE; 262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->initialized = FALSE; 263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->configured = FALSE; 264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* The following methods are defined in MI-X API */ 267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 268bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_version_default(MixVideo * mix, guint * major, 269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint * minor) { 270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix || !major || !minor) { 271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEO(mix)) { 275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; 276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *major = MIXVIDEO_CURRENT - MIXVIDEO_AGE; 279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *minor = MIXVIDEO_AGE; 280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 284bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_initialize_default(MixVideo * mix, MixCodecMode mode, 285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoInitParams * init_params, MixDrmParams * drm_init_params) { 286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixDisplay *mix_display = NULL; 290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix || !init_params) { 294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!mix || !init_params\n"); 295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mode >= MIX_CODEC_MODE_LAST) { 299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("mode >= MIX_CODEC_MODE_LAST\n"); 300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; 301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 //we have encoding support 304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: We need to support encoding in the future */ 305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mode == MIX_CODEC_MODE_ENCODE) { 306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("mode == MIX_CODEC_MODE_ENCODE\n"); 307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEO(mix)) { 312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!MIX_IS_VIDEO(mix)\n"); 313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; 314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEOINITPARAMS(init_params)) { 317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("!MIX_IS_VIDEOINITPARAMS(init_params\n"); 318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; 319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv = MIX_VIDEO_PRIVATE(mix); 322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (priv->initialized) { 324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_W( "priv->initialized\n"); 325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_ALREADY_INIT; 326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* 329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Init thread before any threads/sync object are used. 330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * TODO: If thread is not supported, what we do? 331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!g_thread_supported()) { 334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_W("!g_thread_supported()\n"); 335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_thread_init(NULL); 336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* create object lock */ 339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->objlock = g_mutex_new(); 340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->objlock) { 341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!priv->objlock\n"); 343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* clone mode */ 347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->codec_mode = mode; 348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ref init_params */ 350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->init_params = (MixVideoInitParams *) mix_params_ref(MIX_PARAMS( 351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee init_params)); 352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->init_params) { 353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!priv->init_params\n"); 355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* NOTE: we don't do anything with drm_init_params */ 359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* libVA initialization */ 361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status; 364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Display *display = NULL; 365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoinitparams_get_display(priv->init_params, &mix_display); 366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get display 1\n"); 368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_DISPLAYX11(mix_display)) { 372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixDisplayX11 *mix_displayx11 = MIX_DISPLAYX11(mix_display); 373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_displayx11_get_display(mix_displayx11, &display); 374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get display 2\n"); 376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: add support to other MixDisplay type. For now, just return error!*/ 381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("It is not display x11\n"); 382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_FAIL; 383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Now, we can initialize libVA */ 387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->va_display = vaGetDisplay(display); 388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Oops! Fail to get VADisplay */ 390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->va_display) { 391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_FAIL; 392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Fail to get VADisplay\n"); 393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Initialize libVA */ 397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaInitialize(priv->va_display, &priv->va_major_version, 398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &priv->va_minor_version); 399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Oops! Fail to initialize libVA */ 401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) { 402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_FAIL; 403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Fail to initialize libVA\n"); 404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: check the version numbers of libVA */ 408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->initialized = TRUE; 410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_SUCCESS; 411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cleanup: 414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_video_private_cleanup(priv); 417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(mix_display, mix_display_unref); 420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 426bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_deinitialize_default(MixVideo * mix) { 427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT(mix, priv); 433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_video_private_cleanup(priv); 435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 440bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_decode(MixVideo * mix, 441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsDec * config_params_dec, MixDrmParams * drm_config_params) { 442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsDec *priv_config_params_dec = NULL; 446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gchar *mime_type = NULL; 448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint fps_n, fps_d; 449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint bufpoolsize = 0; 450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixFrameOrderMode frame_order_mode = MIX_FRAMEORDER_MODE_DISPLAYORDER; 452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT(mix, priv); 456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!config_params_dec) { 458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!config_params_dec\n"); 459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEOCONFIGPARAMSDEC(config_params_dec)) { 463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Not a MixVideoConfigParamsDec\n"); 464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; 465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* 471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * MixVideo has already been configured, it should be 472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * re-configured. 473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * TODO: Allow MixVideo re-configuration 475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (priv->configured) { 477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_SUCCESS; 478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_W( "Already configured\n"); 479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Make a copy of config_params */ 483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->config_params = (MixVideoConfigParams *) mix_params_dup(MIX_PARAMS( 484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee config_params_dec)); 485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->config_params) { 486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Fail to duplicate config_params\n"); 488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv_config_params_dec = (MixVideoConfigParamsDec *)priv->config_params; 492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Get fps, frame order mode and mime type from config_params */ 494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsdec_get_mime_type(priv_config_params_dec, &mime_type); 495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get mime type\n"); 497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "mime : %s\n", mime_type); 501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef MIX_LOG_ENABLE 503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (g_strcmp0(mime_type, "video/x-wmv") == 0) { 504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "mime : video/x-wmv\n"); 506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOCONFIGPARAMSDEC_VC1(priv_config_params_dec)) { 507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "VC1 config_param\n"); 508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Not VC1 config_param\n"); 510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsdec_get_frame_order_mode(priv_config_params_dec, 515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &frame_order_mode); 516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to frame order mode\n"); 518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsdec_get_frame_rate(priv_config_params_dec, &fps_n, 522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &fps_d); 523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get frame rate\n"); 525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!fps_n) { 529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_FAIL; 530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "fps_n is 0\n"); 531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsdec_get_buffer_pool_size(priv_config_params_dec, 535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &bufpoolsize); 536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get buffer pool size\n"); 538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* create frame manager */ 542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->frame_manager = mix_framemanager_new(); 543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->frame_manager) { 544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to create frame manager\n"); 546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* initialize frame manager */ 550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (g_strcmp0(mime_type, "video/x-wmv") == 0 || g_strcmp0(mime_type, 552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "video/mpeg") == 0 || g_strcmp0(mime_type, "video/x-divx") == 0) { 553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_framemanager_initialize(priv->frame_manager, 554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee frame_order_mode, fps_n, fps_d, FALSE); 555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_framemanager_initialize(priv->frame_manager, 557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee frame_order_mode, fps_n, fps_d, TRUE); 558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to initialize frame manager\n"); 562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* create buffer pool */ 566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->buffer_pool = mix_bufferpool_new(); 567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->buffer_pool) { 568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to create buffer pool\n"); 570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_bufferpool_initialize(priv->buffer_pool, bufpoolsize); 574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to initialize buffer pool\n"); 576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Finally, we can create MixVideoFormat */ 580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* What type of MixVideoFormat we need create? */ 581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (g_strcmp0(mime_type, "video/x-wmv") == 0 583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && MIX_IS_VIDEOCONFIGPARAMSDEC_VC1(priv_config_params_dec)) { 584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormat_VC1 *video_format = mix_videoformat_vc1_new(); 586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!video_format) { 587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to create VC-1 video format\n"); 589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: work specific to VC-1 */ 593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->video_format = MIX_VIDEOFORMAT(video_format); 595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if (g_strcmp0(mime_type, "video/x-h264") == 0 597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && MIX_IS_VIDEOCONFIGPARAMSDEC_H264(priv_config_params_dec)) { 598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormat_H264 *video_format = mix_videoformat_h264_new(); 600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!video_format) { 601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to create H.264 video format\n"); 603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: work specific to H.264 */ 607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->video_format = MIX_VIDEOFORMAT(video_format); 609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if (g_strcmp0(mime_type, "video/mpeg") == 0 || g_strcmp0(mime_type, 611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "video/x-divx") == 0) { 612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint version = 0; 614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Is this mpeg4:2 ? */ 616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (g_strcmp0(mime_type, "video/mpeg") == 0) { 617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* 619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * we don't support mpeg other than mpeg verion 4 620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEOCONFIGPARAMSDEC_MP42(priv_config_params_dec)) { 622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NOT_SUPPORTED; 623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* what is the mpeg version ? */ 627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsdec_mp42_get_mpegversion( 628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_VIDEOCONFIGPARAMSDEC_MP42(priv_config_params_dec), &version); 629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get mpeg version\n"); 631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* if it is not MPEG4 */ 635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (version != 4) { 636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NOT_SUPPORTED; 637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* config_param shall be MixVideoConfigParamsDecMP42 */ 643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEOCONFIGPARAMSDEC_MP42(priv_config_params_dec)) { 644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NOT_SUPPORTED; 645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* what is the divx version ? */ 649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsdec_mp42_get_divxversion( 650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_VIDEOCONFIGPARAMSDEC_MP42(priv_config_params_dec), &version); 651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get divx version\n"); 653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* if it is not divx 4 or 5 */ 657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (version != 4 && version != 5) { 658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NOT_SUPPORTED; 659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormat_MP42 *video_format = mix_videoformat_mp42_new(); 664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!video_format) { 665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to create MPEG-4:2 video format\n"); 667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: work specific to MPEG-4:2 */ 671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->video_format = MIX_VIDEOFORMAT(video_format); 672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Oops! A format we don't know */ 676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_FAIL; 678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Unknown format, we can't handle it\n"); 679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* initialize MixVideoFormat */ 683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmt_initialize(priv->video_format, priv_config_params_dec, 684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->frame_manager, priv->buffer_pool, &priv->surface_pool, 685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->va_display); 686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed initialize video format\n"); 689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_surfacepool_ref(priv->surface_pool); 693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* decide MixVideoFormat from mime_type*/ 695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->configured = TRUE; 697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_SUCCESS; 698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cleanup: 700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->config_params, mix_videoconfigparams_unref); 703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->frame_manager, mix_framemanager_unref); 704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->buffer_pool, mix_bufferpool_unref); 705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->video_format, mix_videoformat_unref); 706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mime_type) { 709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(mime_type); 710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 719bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 720bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_encode(MixVideo * mix, 721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsEnc * config_params_enc, 722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixDrmParams * drm_config_params) { 723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsEnc *priv_config_params_enc = NULL; 727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gchar *mime_type = NULL; 730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixEncodeTargetFormat encode_format = MIX_ENCODE_TARGET_FORMAT_H264; 731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint bufpoolsize = 0; 732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixFrameOrderMode frame_order_mode = MIX_FRAMEORDER_MODE_DECODEORDER; 734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT(mix, priv); 739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!config_params_enc) { 741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("!config_params_enc\n"); 742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEOCONFIGPARAMSENC(config_params_enc)) { 745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Not a MixVideoConfigParams\n"); 746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; 747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* 753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * MixVideo has already been configured, it should be 754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * re-configured. 755bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 756bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * TODO: Allow MixVideo re-configuration 757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (priv->configured) { 759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_SUCCESS; 760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Already configured\n"); 761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Make a copy of config_params */ 765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->config_params = (MixVideoConfigParams *) mix_params_dup( 766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_PARAMS(config_params_enc)); 767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->config_params) { 768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Fail to duplicate config_params\n"); 770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv_config_params_enc = (MixVideoConfigParamsEnc *)priv->config_params; 774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Get fps, frame order mode and mime type from config_params */ 776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsenc_get_mime_type(priv_config_params_enc, 777bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &mime_type); 778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get mime type\n"); 780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "mime : %s\n", mime_type); 784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsenc_get_encode_format(priv_config_params_enc, 786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &encode_format); 787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get target format\n"); 789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "encode_format : %d\n", 793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee encode_format); 794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsenc_get_buffer_pool_size( 796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv_config_params_enc, &bufpoolsize); 797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get buffer pool size\n"); 799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* create frame manager */ 803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->frame_manager = mix_framemanager_new(); 804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->frame_manager) { 805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to create frame manager\n"); 807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* initialize frame manager */ 811bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* frame rate can be any value for encoding. */ 812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_framemanager_initialize(priv->frame_manager, frame_order_mode, 813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1, 1, FALSE); 814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to initialize frame manager\n"); 817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* create buffer pool */ 821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->buffer_pool = mix_bufferpool_new(); 822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!priv->buffer_pool) { 823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to create buffer pool\n"); 825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_bufferpool_initialize(priv->buffer_pool, bufpoolsize); 829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to initialize buffer pool\n"); 831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 832bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Finally, we can create MixVideoFormatEnc */ 835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* What type of MixVideoFormatEnc we need create? */ 836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (encode_format == MIX_ENCODE_TARGET_FORMAT_H264 838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && MIX_IS_VIDEOCONFIGPARAMSENC_H264(priv_config_params_enc)) { 839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_H264 *video_format_enc = 841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoformatenc_h264_new(); 842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!video_format_enc) { 843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("mix_video_configure_encode: Failed to create h264 video enc format\n"); 845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: work specific to h264 encode */ 849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->video_format_enc = MIX_VIDEOFORMATENC(video_format_enc); 851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (encode_format == MIX_ENCODE_TARGET_FORMAT_MPEG4 854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && MIX_IS_VIDEOCONFIGPARAMSENC_MPEG4(priv_config_params_enc)) { 855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_MPEG4 *video_format_enc = mix_videoformatenc_mpeg4_new(); 857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!video_format_enc) { 858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("mix_video_configure_encode: Failed to create mpeg-4:2 video format\n"); 860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: work specific to mpeg4 */ 864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->video_format_enc = MIX_VIDEOFORMATENC(video_format_enc); 866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (encode_format == MIX_ENCODE_TARGET_FORMAT_PREVIEW 869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && MIX_IS_VIDEOCONFIGPARAMSENC_PREVIEW(priv_config_params_enc)) { 870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_Preview *video_format_enc = mix_videoformatenc_preview_new(); 872bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!video_format_enc) { 873bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "mix_video_configure_encode: Failed to create preview video format\n"); 875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->video_format_enc = MIX_VIDEOFORMATENC(video_format_enc); 879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unsupported format */ 884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NOT_SUPPORTED; 885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Unknown format, we can't handle it\n"); 886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* initialize MixVideoEncFormat */ 890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_initialize(priv->video_format_enc, 891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv_config_params_enc, priv->frame_manager, NULL, &priv->surface_pool, 892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->va_display); 893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed initialize video format\n"); 896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_surfacepool_ref(priv->surface_pool); 900bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee priv->configured = TRUE; 902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_SUCCESS; 903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cleanup: 905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->frame_manager, mix_framemanager_unref); 908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->config_params, mix_videoconfigparams_unref); 909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->buffer_pool, mix_bufferpool_unref); 910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(priv->video_format_enc, mix_videoformatenc_unref); 911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mime_type) { 914bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(mime_type); 915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 925bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_default(MixVideo * mix, 926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParams * config_params, 927bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixDrmParams * drm_config_params) { 928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT(mix, priv); 935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!config_params) { 936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("!config_params\n"); 937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*Decoder mode or Encoder mode*/ 941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (priv->codec_mode == MIX_CODEC_MODE_DECODE && MIX_IS_VIDEOCONFIGPARAMSDEC(config_params)) { 942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_video_configure_decode(mix, (MixVideoConfigParamsDec*)config_params, NULL); 943bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if (priv->codec_mode == MIX_CODEC_MODE_ENCODE && MIX_IS_VIDEOCONFIGPARAMSENC(config_params)) { 944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_video_configure_encode(mix, (MixVideoConfigParamsEnc*)config_params, NULL); 945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Codec mode not supported\n"); 947bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 954bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_config_default(MixVideo * mix, 955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParams ** config_params) { 956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 962bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!config_params) { 963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!config_params\n"); 964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *config_params = MIX_VIDEOCONFIGPARAMS(mix_params_dup(MIX_PARAMS(priv->config_params))); 971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!*config_params) { 972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_NO_MEMORY; 973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to duplicate MixVideoConfigParams\n"); 974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cleanup: 978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 981bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 988bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_decode_default(MixVideo * mix, MixBuffer * bufin[], 989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint bufincnt, MixVideoDecodeParams * decode_params) { 990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 992bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!bufin || !bufincnt || !decode_params) { 998bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!bufin || !bufincnt || !decode_params\n"); 999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //First check that we have surfaces available for decode 1003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_check_available(priv->surface_pool); 1004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret == MIX_RESULT_POOLEMPTY) { 1006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "Out of surface\n"); 1007bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_OUTOFSURFACES; 1008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmt_decode(priv->video_format, bufin, bufincnt, decode_params); 1013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1018bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1019bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1021bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_frame_default(MixVideo * mix, MixVideoFrame ** frame) { 1022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 1026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1029bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!frame) { 1031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!frame\n"); 1032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 1036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V("Calling frame manager dequeue\n"); 1039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_framemanager_dequeue(priv->frame_manager, frame); 1041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 1043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1050bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_frame_default(MixVideo * mix, 1051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFrame * frame) { 1052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 1056bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!frame) { 1061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!frame\n"); 1062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* 1066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * We don't need lock here. MixVideoFrame has lock to 1067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * protect itself. 1068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 1069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 1070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 1071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1072bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 1073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I("Releasing reference frame %x\n", (guint) frame); 1075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref(frame); 1076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_SUCCESS; 1078bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 1080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 1081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 1083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1090bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_render_default(MixVideo * mix, 1091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoRenderParams * render_params, MixVideoFrame *frame) { 1092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 1096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1098bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixDisplay *mix_display = NULL; 1099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixDisplayX11 *mix_display_x11 = NULL; 1100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Display *display = NULL; 1102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Drawable drawable = 0; 1103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixRect src_rect, dst_rect; 1105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VARectangle *va_cliprects = NULL; 1107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint number_of_cliprects = 0; 1108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* VASurfaceID va_surface_id; */ 1110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gulong va_surface_id; 1111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status; 1112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!render_params || !frame) { 1116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!render_params || !frame\n"); 1117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Is this render param valid? */ 1121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEORENDERPARAMS(render_params)) { 1122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Not MixVideoRenderParams\n"); 1123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; 1124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* 1127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * We don't need lock here. priv->va_display may be the only variable 1128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * seems need to be protected. But, priv->va_display is initialized 1129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * when mixvideo object is initialized, and it keeps 1130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * the same value thoughout the life of mixvideo. 1131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 1132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 1133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 1134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 1136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* get MixDisplay prop from render param */ 1138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videorenderparams_get_display(render_params, &mix_display); 1139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 1140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get mix_display\n"); 1141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 1142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Is this MixDisplayX11 ? */ 1145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: we shall also support MixDisplay other than MixDisplayX11 */ 1146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_DISPLAYX11(mix_display)) { 1147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_INVALID_PARAM; 1148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Not MixDisplayX11\n"); 1149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 1150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* cast MixDisplay to MixDisplayX11 */ 1153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_display_x11 = MIX_DISPLAYX11(mix_display); 1154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Get Drawable */ 1156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_displayx11_get_drawable(mix_display_x11, &drawable); 1157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 1158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed to get drawable\n"); 1159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 1160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Get Display */ 1163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_displayx11_get_display(mix_display_x11, &display); 1164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 1165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed to get display\n"); 1166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 1167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* get src_rect */ 1170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videorenderparams_get_src_rect(render_params, &src_rect); 1171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 1172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get SOURCE src_rect\n"); 1173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 1174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* get dst_rect */ 1177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videorenderparams_get_dest_rect(render_params, &dst_rect); 1178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 1179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed to get dst_rect\n"); 1180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 1181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* get va_cliprects */ 1184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videorenderparams_get_cliprects_internal(render_params, 1185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &va_cliprects, &number_of_cliprects); 1186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 1187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get va_cliprects\n"); 1188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 1189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* get surface id from frame */ 1192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_get_frame_id(frame, &va_surface_id); 1193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 1194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed to get va_surface_id\n"); 1195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 1196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint64 timestamp = 0; 1198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_get_timestamp(frame, ×tamp); 1199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Displaying surface ID %d, timestamp %"G_GINT64_FORMAT"\n", (int)va_surface_id, timestamp); 1200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint32 frame_structure = 0; 1202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_get_frame_structure(frame, &frame_structure); 1203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: the last param of vaPutSurface is de-interlacing flags, 1204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee what is value shall be*/ 1205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaPutSurface(priv->va_display, (VASurfaceID) va_surface_id, 1206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee drawable, src_rect.x, src_rect.y, src_rect.width, src_rect.height, 1207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_rect.x, dst_rect.y, dst_rect.width, dst_rect.height, 1208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_cliprects, number_of_cliprects, frame_structure); 1209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) { 1211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_FAIL; 1212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Failed vaPutSurface() : va_status = %d\n", va_status); 1213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 1214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: Is this only for X11? */ 1217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee XSync(display, FALSE); 1218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = MIX_RESULT_SUCCESS; 1220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cleanup: 1222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(mix_display, mix_display_unref) 1224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* MIXUNREF(render_params, mix_videorenderparams_unref)*/ 1225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 1227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 1228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 1230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1237bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_encode_default(MixVideo * mix, MixBuffer * bufin[], 1238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint bufincnt, MixIOVec * iovout[], gint iovoutcnt, 1239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoEncodeParams * encode_params) { 1240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 1242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!bufin || !bufincnt) { //we won't check encode_params here, it's just a placeholder 1248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!bufin || !bufincnt\n"); 1249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_encode(priv->video_format_enc, bufin, bufincnt, 1255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee iovout, iovoutcnt, encode_params); 1256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1263bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_flush_default(MixVideo * mix) { 1264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 1266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 1273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (priv->codec_mode == MIX_CODEC_MODE_DECODE && priv->video_format != NULL) { 1276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmt_flush(priv->video_format); 1277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_framemanager_flush(priv->frame_manager); 1279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if (priv->codec_mode == MIX_CODEC_MODE_ENCODE 1280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && priv->video_format_enc != NULL) { 1281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*No framemanager for encoder now*/ 1282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_flush(priv->video_format_enc); 1283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 1284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Invalid video_format/video_format_enc Pointer\n"); 1286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 1290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1298bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_eos_default(MixVideo * mix) { 1299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 1301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 1308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (priv->codec_mode == MIX_CODEC_MODE_DECODE && priv->video_format != NULL) { 1311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmt_eos(priv->video_format); 1312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* frame manager will set EOS flag to be TRUE */ 1314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_framemanager_eos(priv->frame_manager); 1315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if (priv->codec_mode == MIX_CODEC_MODE_ENCODE 1316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee && priv->video_format_enc != NULL) { 1317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*No framemanager now*/ 1318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_eos(priv->video_format_enc); 1319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 1320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E("Invalid video_format/video_format_enc Pointer\n"); 1322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 1326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1333bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_state_default(MixVideo * mix, MixState * state) { 1334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!state) { 1342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!state\n"); 1343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *state = MIX_STATE_CONFIGURED; 1347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 1351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1353bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_mixbuffer_default(MixVideo * mix, MixBuffer ** buf) { 1354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 1356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!buf) { 1363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!buf\n"); 1364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; 1365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 1368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_bufferpool_get(priv->buffer_pool, buf); 1371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 1373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End ret = 0x%x\n", ret); 1376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1381bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_mixbuffer_default(MixVideo * mix, MixBuffer * buf) { 1382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 1384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!buf) { 1391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!buf\n"); 1392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; 1393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- begin lock --------------------- */ 1396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_buffer_unref(buf); 1399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* ---------------------- end lock --------------------- */ 1401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1408bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_max_coded_buffer_size_default (MixVideo * mix, guint *max_size) 1409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_FAIL; 1411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoPrivate *priv = NULL; 1412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix || !max_size) /* TODO: add other parameter NULL checking */ 1416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!mix || !bufsize\n"); 1418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_INIT_CONFIG(mix, priv); 1422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(priv->objlock); 1424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_get_max_coded_buffer_size(priv->video_format_enc, max_size); 1426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(priv->objlock); 1428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 1430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 1431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 1434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * API functions 1435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 1436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define CHECK_AND_GET_MIX_CLASS(mix, klass) \ 1438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix) { \ 1439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; \ 1440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } \ 1441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!MIX_IS_VIDEO(mix)) { \ 1442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Not MixVideo\n"); \ 1443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_INVALID_PARAM; \ 1444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } \ 1445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass = MIX_VIDEO_GET_CLASS(mix); 1446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1448bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_version(MixVideo * mix, guint * major, guint * minor) { 1449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->get_version_func) { 1454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->get_version_func(mix, major, minor); 1455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1460bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_initialize(MixVideo * mix, MixCodecMode mode, 1461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoInitParams * init_params, MixDrmParams * drm_init_params) { 1462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->initialize_func) { 1467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->initialize_func(mix, mode, init_params, drm_init_params); 1468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1473bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_deinitialize(MixVideo * mix) { 1474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->deinitialize_func) { 1479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->deinitialize_func(mix); 1480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1484bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure(MixVideo * mix, 1485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParams * config_params, 1486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixDrmParams * drm_config_params) { 1487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->configure_func) { 1492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->configure_func(mix, config_params, drm_config_params); 1493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1497bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_config(MixVideo * mix, 1498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParams ** config_params_dec) { 1499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->get_config_func) { 1504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->get_config_func(mix, config_params_dec); 1505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1510bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_decode(MixVideo * mix, MixBuffer * bufin[], gint bufincnt, 1511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoDecodeParams * decode_params) { 1512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->decode_func) { 1517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->decode_func(mix, bufin, bufincnt, 1518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee decode_params); 1519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1524bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_frame(MixVideo * mix, MixVideoFrame ** frame) { 1525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->get_frame_func) { 1530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->get_frame_func(mix, frame); 1531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1536bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_frame(MixVideo * mix, MixVideoFrame * frame) { 1537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->release_frame_func) { 1542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->release_frame_func(mix, frame); 1543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1547bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_render(MixVideo * mix, 1548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoRenderParams * render_params, MixVideoFrame *frame) { 1549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->render_func) { 1554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->render_func(mix, render_params, frame); 1555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1560bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_encode(MixVideo * mix, MixBuffer * bufin[], gint bufincnt, 1561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixIOVec * iovout[], gint iovoutcnt, 1562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoEncodeParams * encode_params) { 1563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->encode_func) { 1568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->encode_func(mix, bufin, bufincnt, iovout, iovoutcnt, 1569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee encode_params); 1570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1575bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_flush(MixVideo * mix) { 1576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->flush_func) { 1581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->flush_func(mix); 1582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1586bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_eos(MixVideo * mix) { 1587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->eos_func) { 1592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->eos_func(mix); 1593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1597bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_state(MixVideo * mix, MixState * state) { 1598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->get_state_func) { 1603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->get_state_func(mix, state); 1604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1608bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_mixbuffer(MixVideo * mix, MixBuffer ** buf) { 1609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->get_mix_buffer_func) { 1614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->get_mix_buffer_func(mix, buf); 1615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1619bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_mixbuffer(MixVideo * mix, MixBuffer * buf) { 1620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = NULL; 1622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee CHECK_AND_GET_MIX_CLASS(mix, klass); 1623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->release_mix_buffer_func) { 1625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->release_mix_buffer_func(mix, buf); 1626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1630bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_max_coded_buffer_size(MixVideo * mix, guint *bufsize) { 1631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoClass *klass = MIX_VIDEO_GET_CLASS(mix); 1633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->get_max_coded_buffer_size_func) { 1635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->get_max_coded_buffer_size_func(mix, bufsize); 1636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 1638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1639