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#include <glib.h> 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <string.h> 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <stdlib.h> 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideolog.h" 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc_preview.h" 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_preview.h" 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MDEBUG 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#undef SHOW_SRC 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef SHOW_SRC 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeWindow win = 0; 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif /* SHOW_SRC */ 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* The parent class. The pointer will be saved 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * in this class's initialization. The pointer 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * can be used for chaining method call if needed. 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MixVideoFormatEncClass *parent_class = NULL; 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_preview_finalize(GObject * obj); 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Please note that the type we pass to G_DEFINE_TYPE is MIX_TYPE_VIDEOFORMATENC 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeG_DEFINE_TYPE (MixVideoFormatEnc_Preview, mix_videoformatenc_preview, MIX_TYPE_VIDEOFORMATENC); 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_preview_init(MixVideoFormatEnc_Preview * self) { 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = MIX_VIDEOFORMATENC(self); 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: public member initialization */ 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: private member initialization */ 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->encoded_frames = 0; 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->pic_skipped = FALSE; 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->is_intra = TRUE; 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->cur_fame = NULL; 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ref_fame = NULL; 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->rec_fame = NULL; 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ci_shared_surfaces = NULL; 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces= NULL; 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surface_num = 0; 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->initialized = FALSE; 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_preview_class_init( 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_PreviewClass * klass) { 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* root class */ 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee GObjectClass *gobject_class = (GObjectClass *) klass; 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* direct parent class */ 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEncClass *video_formatenc_class = 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_VIDEOFORMATENC_CLASS(klass); 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* parent class for later use */ 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent_class = g_type_class_peek_parent(klass); 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* setup finializer */ 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gobject_class->finalize = mix_videoformatenc_preview_finalize; 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* setup vmethods with base implementation */ 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: decide if we need to override the parent's methods */ 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->getcaps = mix_videofmtenc_preview_getcaps; 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->initialize = mix_videofmtenc_preview_initialize; 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->encode = mix_videofmtenc_preview_encode; 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->flush = mix_videofmtenc_preview_flush; 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->eos = mix_videofmtenc_preview_eos; 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->deinitialize = mix_videofmtenc_preview_deinitialize; 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_Preview * 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_preview_new(void) { 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_Preview *ret = 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_object_new(MIX_TYPE_VIDEOFORMATENC_PREVIEW, NULL); 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_videoformatenc_preview_finalize(GObject * obj) { 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* clean up here. */ 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*MixVideoFormatEnc_Preview *mix = MIX_VIDEOFORMATENC_PREVIEW(obj); */ 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee GObjectClass *root_class = (GObjectClass *) parent_class; 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "\n"); 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Chain up parent */ 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (root_class->finalize) { 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee root_class->finalize(obj); 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_Preview * 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_preview_ref(MixVideoFormatEnc_Preview * mix) { 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return (MixVideoFormatEnc_Preview *) g_object_ref(G_OBJECT(mix)); 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*Preview vmethods implementation */ 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_getcaps(MixVideoFormatEnc *mix, GString *msg) { 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: add codes for Preview format */ 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: decide if we need to chainup parent method. 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * if we do, the following is the code: 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "mix_videofmtenc_preview_getcaps\n"); 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) { 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "mix == NULL\n"); 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->getcaps) { 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->getcaps(mix, msg); 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_initialize(MixVideoFormatEnc *mix, 135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsEnc * config_params_enc, 136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixFrameManager * frame_mgr, 137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool * input_buf_pool, 138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixSurfacePool ** surface_pool, 139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VADisplay va_display ) { 140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_SUCCESS; 142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsEncPreview * config_params_enc_preview; 144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status = VA_STATUS_SUCCESS; 146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VASurfaceID * surfaces; 147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint va_max_num_profiles, va_max_num_entrypoints, va_max_num_attribs; 149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint va_num_profiles, va_num_entrypoints; 150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAProfile *va_profiles = NULL; 152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEntrypoint *va_entrypoints = NULL; 153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAConfigAttrib va_attrib[2]; 154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint index; 155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*frame_mgr and input_buf_pool is reservered for future use*/ 158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL || config_params_enc == NULL || va_display == NULL) { 160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix == NULL || config_params_enc == NULL || va_display == NULL\n"); 162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "begin\n"); 166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO additional parameter checking 169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Chainup parent method. */ 171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1 172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->initialize) { 173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = parent_class->initialize(mix, config_params_enc, 174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee frame_mgr, input_buf_pool, surface_pool, 175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_display); 176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif //disable it currently 184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_PREVIEW(mix)) 186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(&(mix->parent)); 188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_Preview *self = MIX_VIDEOFORMATENC_PREVIEW(mix); 189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOCONFIGPARAMSENC_PREVIEW (config_params_enc)) { 191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee config_params_enc_preview = 192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_VIDEOCONFIGPARAMSENC_PREVIEW (config_params_enc); 193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix_videofmtenc_preview_initialize: no preview config params found\n"); 196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(parent->objectlock); 200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Get properities from params done\n"); 204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //display = XOpenDisplay(NULL); 207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //va_display = vaGetDisplay (videoencobj->display); 208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_display = va_display; 210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Get Display\n"); 212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "Display = 0x%08x\n", 213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint)va_display); 214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //va_status = vaInitialize(va_display, &va_major_ver, &va_minor_ver); 216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //g_print ("vaInitialize va_status = %d\n", va_status); 217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* query the vender information, can ignore*/ 221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_vendor = vaQueryVendorString (va_display); 222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "Vendor = %s\n", 223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_vendor); 224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*get the max number for profiles/entrypoints/attribs*/ 227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_profiles = vaMaxNumProfiles(va_display); 228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_max_num_profiles = %d\n", 229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_profiles); 230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_entrypoints = vaMaxNumEntrypoints(va_display); 232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_max_num_entrypoints = %d\n", 233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_entrypoints); 234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_attribs = vaMaxNumConfigAttributes(va_display); 236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_max_num_attribs = %d\n", 237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_attribs); 238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_profiles = g_malloc(sizeof(VAProfile)*va_max_num_profiles); 240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_entrypoints = g_malloc(sizeof(VAEntrypoint)*va_max_num_entrypoints); 241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_profiles == NULL || va_entrypoints ==NULL) 243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "!va_profiles || !va_entrypoints\n"); 246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "va_profiles = 0x%08x\n", (guint)va_profiles); 252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaQueryConfigProfiles\n"); 254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaQueryConfigProfiles (va_display, va_profiles, &va_num_profiles); 257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to call vaQueryConfigProfiles\n"); 262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaQueryConfigProfiles Done\n"); 269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*check whether profile is supported*/ 273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(index= 0; index < va_num_profiles; index++) { 274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(parent->va_profile == va_profiles[index]) 275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(index == va_num_profiles) 279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Profile not supported\n"); 281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; //Todo, add error handling here 285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaQueryConfigEntrypoints\n"); 288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*Check entry point*/ 291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaQueryConfigEntrypoints(va_display, 292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_profile, 293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_entrypoints, &va_num_entrypoints); 294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to call vaQueryConfigEntrypoints\n"); 299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (index = 0; index < va_num_entrypoints; index ++) { 306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_entrypoints[index] == VAEntrypointEncSlice) { 307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (index == va_num_entrypoints) { 312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Entrypoint not found\n"); 313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; //Todo, add error handling here 317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*free profiles and entrypoints*/ 321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[0].type = VAConfigAttribRTFormat; 325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[1].type = VAConfigAttribRateControl; 326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaGetConfigAttributes\n"); 328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaGetConfigAttributes(va_display, parent->va_profile, 330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_entrypoint, 331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &va_attrib[0], 2); 332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to call vaGetConfigAttributes\n"); 337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((va_attrib[0].value & parent->va_format) == 0) { 342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Matched format not found\n"); 343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; //Todo, add error handling here 345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((va_attrib[1].value & parent->va_rcmode) == 0) { 349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "RC mode not found\n"); 350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; //Todo, add error handling here 352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[0].value = parent->va_format; //VA_RT_FORMAT_YUV420; 355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[1].value = parent->va_rcmode; 356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "======VA Configuration======\n"); 358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "profile = %d\n", 360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_profile); 361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_entrypoint = %d\n", 362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_entrypoint); 363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_attrib[0].type = %d\n", 364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[0].type); 365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_attrib[1].type = %d\n", 366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[1].type); 367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_attrib[0].value (Format) = %d\n", 368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[0].value); 369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_attrib[1].value (RC mode) = %d\n", 370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[1].value); 371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaCreateConfig\n"); 373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateConfig(va_display, parent->va_profile, 375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_entrypoint, 376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &va_attrib[0], 2, &(parent->va_config)); 377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed vaCreateConfig\n"); 381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*TODO: compute the surface number*/ 386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int numSurfaces; 387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->share_buf_mode) { 389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee numSurfaces = 2; 390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee numSurfaces = 8; 393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->ci_frame_num = 0; 394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surface_num = numSurfaces + parent->ci_frame_num; 397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee surfaces = g_malloc(sizeof(VASurfaceID)*numSurfaces); 399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (surfaces == NULL) 401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed allocate surface\n"); 404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaCreateSurfaces\n"); 409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateSurfaces(va_display, parent->picture_width, 411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->picture_height, parent->va_format, 412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee numSurfaces, surfaces); 413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO check vret and return fail if needed 414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed vaCreateSurfaces\n"); 419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->share_buf_mode) { 424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "We are in share buffer mode!\n"); 427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ci_shared_surfaces = 428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_malloc(sizeof(VASurfaceID) * parent->ci_frame_num); 429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->ci_shared_surfaces == NULL) 431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed allocate shared surface\n"); 434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint index; 439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(index = 0; index < parent->ci_frame_num; index++) { 440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "ci_frame_id = %lu\n", 442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->ci_frame_id[index]); 443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "vaCreateSurfaceFromCIFrame\n"); 446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateSurfaceFromCIFrame(va_display, 448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (gulong) (parent->ci_frame_id[index]), 449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &self->ci_shared_surfaces[index]); 450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaCreateSurfaceFromCIFrame\n"); 454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "vaCreateSurfaceFromCIFrame Done\n"); 461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }// if (parent->share_buf_mode) 463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces = g_malloc(sizeof(VASurfaceID) * self->surface_num); 465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->surfaces == NULL) 467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed allocate private surface\n"); 470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->share_buf_mode) { 476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*shared surfaces should be put in pool first, 477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * because we will get it accoring to CI index*/ 478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(index = 0; index < parent->ci_frame_num; index++) 479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces[index] = self->ci_shared_surfaces[index]; 480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(index = 0; index < numSurfaces; index++) { 483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces[index + parent->ci_frame_num] = surfaces[index]; 484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "assign surface Done\n"); 487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "Created %d libva surfaces\n", 488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee numSurfaces + parent->ci_frame_num); 489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 //current put this in gst 491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee images = g_malloc(sizeof(VAImage)*numSurfaces); 492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (images == NULL) 493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (index = 0; index < numSurfaces; index++) { 499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Derive an VAImage from an existing surface. 500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //The image buffer can then be mapped/unmapped for CPU access 501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDeriveImage(va_display, surfaces[index], 502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &images[index]); 503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "mix_surfacepool_new\n"); 507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->surfacepool = mix_surfacepool_new(); 509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (surface_pool) 510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *surface_pool = parent->surfacepool; 511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //which is useful to check before encode 512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->surfacepool == NULL) 514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_surfacepool_new\n"); 517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix_surfacepool_initialize\n"); 524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_initialize(parent->surfacepool, 526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces, parent->ci_frame_num + numSurfaces); 527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch (ret) 529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case MIX_RESULT_SUCCESS: 531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case MIX_RESULT_ALREADY_INIT: 533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO cleanup and/or retry 534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: 538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Initialize and save the VA context ID 543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaCreateContext\n"); 544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateContext(va_display, parent->va_config, 546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->picture_width, parent->picture_height, 547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 0, self->surfaces, parent->ci_frame_num + numSurfaces, 548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &(parent->va_context)); 549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Created libva context width %d, height %d\n", 552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->picture_width, parent->picture_height); 553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaCreateContext\n"); 558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_status = %d\n", 559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint)va_status); 560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->coded_buf_size = 4; 566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*Create coded buffer for output*/ 568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateBuffer (va_display, parent->va_context, 569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEncCodedBufferType, 570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->coded_buf_size, // 571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1, NULL, 572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &self->coded_buf); 573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaCreateBuffer: VAEncCodedBufferType\n"); 578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef SHOW_SRC 584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Display * display = XOpenDisplay (NULL); 585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "display = 0x%08x\n", 587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint) display); 588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee win = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, 589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->picture_width, parent->picture_height, 0, 0, 590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee WhitePixel(display, 0)); 591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee XMapWindow(display, win); 592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee XSelectInput(display, win, KeyPressMask | StructureNotifyMask); 593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee XSync(display, False); 595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_display = 0x%08x\n", 596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint) va_display); 597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif /* SHOW_SRC */ 599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->initialized = TRUE; 601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not Preview video encode Object\n"); 610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 619bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_encode(MixVideoFormatEnc *mix, MixBuffer * bufin[], 620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint bufincnt, MixIOVec * iovout[], gint iovoutcnt, 621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoEncodeParams * encode_params) { 622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_SUCCESS; 624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*currenly only support one input and output buffer*/ 629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO: params i 630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (bufincnt != 1 || iovoutcnt != 1) { 632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "buffer count not equel to 1\n"); 634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "maybe some exception occurs\n"); 636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL ||bufin[0] == NULL || iovout[0] == NULL) { 639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "!mix || !bufin[0] ||!iovout[0]\n"); 641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO: encode_params is reserved here for future usage. 645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: decide if we need to chainup parent method. 647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * * * if we do, the following is the code: 648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * */ 649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->encode) { 652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->encode(mix, bufin, bufincnt, iovout, 653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee iovoutcnt, encode_params); 654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_PREVIEW(mix)) 658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(&(mix->parent)); 661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_Preview *self = MIX_VIDEOFORMATENC_PREVIEW (mix); 662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Locking\n"); 664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(parent->objectlock); 665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO: also we could move some encode Preparation work to here 668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix_videofmtenc_preview_process_encode\n"); 671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_preview_process_encode (self, 673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee bufin[0], iovout[0]); 674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed mix_videofmtenc_preview_process_encode\n"); 678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "UnLocking\n"); 683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not Preview video encode Object\n"); 690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 698bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_flush(MixVideoFormatEnc *mix) { 699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //MIX_RESULT ret = MIX_RESULT_SUCCESS; 701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) { 705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "mix == NULL\n"); 706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*not chain to parent flush func*/ 711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->flush) { 713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->flush(mix, msg); 714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_Preview *self = MIX_VIDEOFORMATENC_PREVIEW(mix); 718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 719bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(mix->objectlock); 720bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the current source surface*/ 723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->cur_fame != NULL) 724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->cur_fame); 726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->cur_fame = NULL; 727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the reconstructed surface*/ 731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->rec_fame != NULL) 732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->rec_fame); 734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->rec_fame = NULL; 735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the reference surface*/ 738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->ref_fame != NULL) 739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->ref_fame); 741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ref_fame = NULL; 742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*reset the properities*/ 745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->encoded_frames = 0; 746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->pic_skipped = FALSE; 747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->is_intra = TRUE; 748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(mix->objectlock); 750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 755bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 756bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_eos(MixVideoFormatEnc *mix) { 757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: add codes for preview */ 759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: decide if we need to chainup parent method. 761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * if we do, the following is the code: 762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "\n"); 765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) { 767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "mix == NULL\n"); 768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->eos) { 772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->eos(mix); 773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 777bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_deinitialize(MixVideoFormatEnc *mix) { 778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status; 781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) { 785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "mix == NULL\n"); 786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(&(mix->parent)); 790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_Preview *self = MIX_VIDEOFORMATENC_PREVIEW(mix); 791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Release frames\n"); 793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(parent->objectlock); 795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the current source surface*/ 798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->cur_fame != NULL) 799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->cur_fame); 801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->cur_fame = NULL; 802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the reconstructed surface*/ 806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->rec_fame != NULL) 807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->rec_fame); 809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->rec_fame = NULL; 810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 811bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the reference surface*/ 813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->ref_fame != NULL) 814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->ref_fame); 816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ref_fame = NULL; 817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Release surfaces\n"); 820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->ci_shared_surfaces) 822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (self->ci_shared_surfaces); 824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ci_shared_surfaces = NULL; 825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->surfaces) 828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (self->surfaces); 830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces = NULL; 831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 832bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaDestroyContext\n"); 834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDestroyContext (parent->va_display, parent->va_context); 836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed vaDestroyContext\n"); 840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaDestroyConfig\n"); 845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDestroyConfig (parent->va_display, parent->va_config); 847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed vaDestroyConfig\n"); 851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->initialized = TRUE; 856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1 860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->deinitialize) { 861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->deinitialize(mix); 862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Most stuff is cleaned up in parent_class->finalize() 866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 872bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 873bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_process_encode (MixVideoFormatEnc_Preview *mix, 874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBuffer * bufin, MixIOVec * iovout) 875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_SUCCESS; 878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status = VA_STATUS_SUCCESS; 879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VADisplay va_display = NULL; 880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAContextID va_context; 881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gulong surface = 0; 882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint16 width, height; 883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //MixVideoFrame * tmp_fame; 885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //guint8 *buf; 886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((mix == NULL) || (bufin == NULL) || (iovout == NULL)) { 888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix == NUL) || bufin == NULL || iovout == NULL\n"); 890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_PREVIEW(mix)) 896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = MIX_VIDEOFORMATENC(&(mix->parent)); 899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 900bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_display = parent->va_display; 901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_context = parent->va_context; 902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee width = parent->picture_width; 903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee height = parent->picture_height; 904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "encoded_frames = %d\n", 907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->encoded_frames); 908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "is_intra = %d\n", 909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->is_intra); 910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "ci_frame_id = 0x%08x\n", 911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint) parent->ci_frame_id); 912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 914bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Get Surface from the pool\n"); 915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*current we use one surface for source data, 917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * one for reference and one for reconstructed*/ 918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*TODO, could be refine here*/ 919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!parent->share_buf_mode) { 921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "We are NOT in share buffer mode\n"); 923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->ref_fame == NULL) 925bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get(parent->surfacepool, &mix->ref_fame); 927bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) //#ifdef SLEEP_SURFACE not used 928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_surfacepool_get\n"); 931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->rec_fame == NULL) 936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get(parent->surfacepool, &mix->rec_fame); 938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_surfacepool_get\n"); 942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 943bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->need_display) { 947bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->cur_fame = NULL; 948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->cur_fame == NULL) 951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get(parent->surfacepool, &mix->cur_fame); 953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 954bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_surfacepool_get\n"); 957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Get Surface Done\n"); 962bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAImage src_image; 965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint8 *pvbuf; 966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint8 *dst_y; 967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint8 *dst_uv; 968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int i,j; 969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "map source data to surface\n"); 972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_get_frame_id(mix->cur_fame, &surface); 974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_videoframe_get_frame_id\n"); 978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 981bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "surface id = 0x%08x\n", (guint) surface); 984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDeriveImage(va_display, surface, &src_image); 986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //need to destroy 987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 988bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaDeriveImage\n"); 992bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAImage *image = &src_image; 996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaDeriveImage Done\n"); 998bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaMapBuffer (va_display, image->buf, (void **)&pvbuf); 1001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed to vaMapBuffer\n"); 1004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1007bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "vaImage information\n"); 1009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->pitches[0] = %d\n", image->pitches[0]); 1011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->pitches[1] = %d\n", image->pitches[1]); 1013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->offsets[0] = %d\n", image->offsets[0]); 1015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->offsets[1] = %d\n", image->offsets[1]); 1017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1018bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->num_planes = %d\n", image->num_planes); 1019bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->width = %d\n", image->width); 1021bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->height = %d\n", image->height); 1023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "input buf size = %d\n", bufin->size); 1026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint8 *inbuf = bufin->data; 1028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1029bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*need to convert YUV420 to NV12*/ 1030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_y = pvbuf +image->offsets[0]; 1031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; i < height; i ++) { 1033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee memcpy (dst_y, inbuf + i * width, width); 1034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_y += image->pitches[0]; 1035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_uv = pvbuf + image->offsets[1]; 1038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; i < height / 2; i ++) { 1040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (j = 0; j < width; j+=2) { 1041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_uv [j] = inbuf [width * height + i * width / 2 + j / 2]; 1042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_uv [j + 1] = 1043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee inbuf [width * height * 5 / 4 + i * width / 2 + j / 2]; 1044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_uv += image->pitches[1]; 1046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vaUnmapBuffer(va_display, image->buf); 1049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1050bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaUnmapBuffer\n"); 1053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1056bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDestroyImage(va_display, src_image.image_id); 1057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaDestroyImage\n"); 1061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Map source data to surface done\n"); 1066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else {//if (!parent->share_buf_mode) 1070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFrame * frame = mix_videoframe_new(); 1072bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->ref_fame == NULL) 1074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_set_ci_frame_idx (frame, mix->surface_num - 1); 1076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get_frame_with_ci_frameidx 1078bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (parent->surfacepool, &mix->ref_fame, frame); 1079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) //#ifdef SLEEP_SURFACE not used 1080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "get reference surface from pool failed\n"); 1083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->rec_fame == NULL) 1088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_set_ci_frame_idx (frame, mix->surface_num - 2); 1090bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get_frame_with_ci_frameidx 1092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (parent->surfacepool, &mix->rec_fame, frame); 1093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "get recontructed surface from pool failed\n"); 1098bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //mix_videoframe_unref (mix->cur_fame); 1103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->need_display) { 1105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->cur_fame = NULL; 1106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->cur_fame == NULL) 1109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint ci_idx; 1111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee memcpy (&ci_idx, bufin->data, bufin->size); 1112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "surface_num = %d\n", mix->surface_num); 1115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "ci_frame_idx = %d\n", ci_idx); 1117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ci_idx > mix->surface_num - 2) { 1119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "the CI frame idx is too bigger than CI frame number\n"); 1121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_set_ci_frame_idx (frame, ci_idx); 1126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get_frame_with_ci_frameidx 1128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (parent->surfacepool, &mix->cur_fame, frame); 1129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "get current working surface from pool failed\n"); 1134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_get_frame_id(mix->cur_fame, &surface); 1139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaBeginPicture\n"); 1143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_context = 0x%08x\n",(guint)va_context); 1144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "surface = 0x%08x\n",(guint)surface); 1145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_display = 0x%08x\n",(guint)va_display); 1146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee iovout->data_size = 4; 1148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee iovout->data = g_malloc (iovout->data_size); 1149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (iovout->data == NULL) { 1150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 1151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee memset (iovout->data, 0, iovout->data_size); 1154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee iovout->buffer_size = iovout->data_size; 1156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->need_display) { 1159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_framemanager_enqueue(parent->framemgr, mix->cur_fame); 1160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed mix_framemanager_enqueue\n"); 1164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(parent->need_display)) { 1170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (mix->cur_fame); 1171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->cur_fame = NULL; 1172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->encoded_frames ++; 1175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not Preview video encode Object\n"); 1180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 1185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 1187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1188