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_mpeg4.h" 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_mpeg4.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_mpeg4_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_MPEG4, mix_videoformatenc_mpeg4, MIX_TYPE_VIDEOFORMATENC); 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_mpeg4_init(MixVideoFormatEnc_MPEG4 * 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_mpeg4_class_init( 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_MPEG4Class * 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_mpeg4_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_mpeg4_getcaps; 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->initialize = mix_videofmtenc_mpeg4_initialize; 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->encode = mix_videofmtenc_mpeg4_encode; 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->flush = mix_videofmtenc_mpeg4_flush; 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->eos = mix_videofmtenc_mpeg4_eos; 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->deinitialize = mix_videofmtenc_mpeg4_deinitialize; 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee video_formatenc_class->getmaxencodedbufsize = mix_videofmtenc_mpeg4_get_max_encoded_buf_size; 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_MPEG4 * 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_mpeg4_new(void) { 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_MPEG4 *ret = 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_object_new(MIX_TYPE_VIDEOFORMATENC_MPEG4, NULL); 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_videoformatenc_mpeg4_finalize(GObject * obj) { 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* clean up here. */ 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*MixVideoFormatEnc_MPEG4 *mix = MIX_VIDEOFORMATENC_MPEG4(obj); */ 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee GObjectClass *root_class = (GObjectClass *) parent_class; 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "\n"); 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Chain up parent */ 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (root_class->finalize) { 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee root_class->finalize(obj); 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_MPEG4 * 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_mpeg4_ref(MixVideoFormatEnc_MPEG4 * mix) { 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return (MixVideoFormatEnc_MPEG4 *) g_object_ref(G_OBJECT(mix)); 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*MPEG-4:2 vmethods implementation */ 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_getcaps(MixVideoFormatEnc *mix, GString *msg) { 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: add codes for MPEG-4:2 */ 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: decide if we need to chainup parent method. 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * if we do, the following is the code: 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "mix_videofmtenc_mpeg4_getcaps\n"); 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) { 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "mix == NULL\n"); 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->getcaps) { 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->getcaps(mix, msg); 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 135bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_initialize(MixVideoFormatEnc *mix, 136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsEnc * config_params_enc, 137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixFrameManager * frame_mgr, 138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool * input_buf_pool, 139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixSurfacePool ** surface_pool, 140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VADisplay va_display ) { 141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_SUCCESS; 143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsEncMPEG4 * config_params_enc_mpeg4; 145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status = VA_STATUS_SUCCESS; 147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VASurfaceID * surfaces; 148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint va_max_num_profiles, va_max_num_entrypoints, va_max_num_attribs; 150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint va_num_profiles, va_num_entrypoints; 151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAProfile *va_profiles = NULL; 153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEntrypoint *va_entrypoints = NULL; 154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAConfigAttrib va_attrib[2]; 155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint index; 156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*frame_mgr and input_buf_pool is reservered for future use*/ 159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL || config_params_enc == NULL || va_display == NULL) { 161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix == NULL || config_params_enc == NULL || va_display == NULL\n"); 163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "begin\n"); 167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO additional parameter checking 170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Chainup parent method. */ 172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1 173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->initialize) { 174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = parent_class->initialize(mix, config_params_enc, 175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee frame_mgr, input_buf_pool, surface_pool, 176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_display); 177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif //disable it currently 185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_MPEG4(mix)) 187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(&(mix->parent)); 189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4(mix); 190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOCONFIGPARAMSENC_MPEG4 (config_params_enc)) { 192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee config_params_enc_mpeg4 = 193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_VIDEOCONFIGPARAMSENC_MPEG4 (config_params_enc); 194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix_videofmtenc_mpeg4_initialize: no mpeg4 config params found\n"); 197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(parent->objectlock); 201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Start to get properities from MPEG-4:2 params\n"); 204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* get properties from MPEG4 params Object, which is special to MPEG4 format*/ 206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsenc_mpeg4_get_profile_level (config_params_enc_mpeg4, 208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &self->profile_and_level_indication); 209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO cleanup 212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_videoconfigparamsenc_mpeg4_get_profile_level\n"); 214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsenc_mpeg4_get_fixed_vti (config_params_enc_mpeg4, 219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &(self->fixed_vop_time_increment)); 220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO cleanup 223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_videoconfigparamsenc_mpeg4_get_fixed_vti\n"); 225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoconfigparamsenc_mpeg4_get_dlk (config_params_enc_mpeg4, 230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &(self->disable_deblocking_filter_idc)); 231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) { 233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO cleanup 234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to config_params_enc_mpeg4\n"); 236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "======MPEG4 Encode Object properities======:\n"); 243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "self->profile_and_level_indication = %d\n", 245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->profile_and_level_indication); 246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "self->fixed_vop_time_increment = %d\n\n", 247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->fixed_vop_time_increment); 248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Get properities from params done\n"); 251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //display = XOpenDisplay(NULL); 254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //va_display = vaGetDisplay (videoencobj->display); 255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_display = va_display; 257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Get Display\n"); 259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "Display = 0x%08x\n", 260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint)va_display); 261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //va_status = vaInitialize(va_display, &va_major_ver, &va_minor_ver); 263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //g_print ("vaInitialize va_status = %d\n", va_status); 264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* query the vender information, can ignore*/ 268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_vendor = vaQueryVendorString (va_display); 269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "Vendor = %s\n", 270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_vendor); 271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*get the max number for profiles/entrypoints/attribs*/ 274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_profiles = vaMaxNumProfiles(va_display); 275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_max_num_profiles = %d\n", 276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_profiles); 277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_entrypoints = vaMaxNumEntrypoints(va_display); 279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_max_num_entrypoints = %d\n", 280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_entrypoints); 281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_attribs = vaMaxNumConfigAttributes(va_display); 283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_max_num_attribs = %d\n", 284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_max_num_attribs); 285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_profiles = g_malloc(sizeof(VAProfile)*va_max_num_profiles); 287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_entrypoints = g_malloc(sizeof(VAEntrypoint)*va_max_num_entrypoints); 288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_profiles == NULL || va_entrypoints ==NULL) 290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "!va_profiles || !va_entrypoints\n"); 293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "va_profiles = 0x%08x\n", (guint)va_profiles); 299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaQueryConfigProfiles\n"); 301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaQueryConfigProfiles (va_display, va_profiles, &va_num_profiles); 304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to call vaQueryConfigProfiles\n"); 309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaQueryConfigProfiles Done\n"); 316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*check whether profile is supported*/ 320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(index= 0; index < va_num_profiles; index++) { 321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(parent->va_profile == va_profiles[index]) 322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(index == va_num_profiles) 326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Profile not supported\n"); 328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; //Todo, add error handling here 332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaQueryConfigEntrypoints\n"); 335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*Check entry point*/ 338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaQueryConfigEntrypoints(va_display, 339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_profile, 340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_entrypoints, &va_num_entrypoints); 341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to call vaQueryConfigEntrypoints\n"); 346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (index = 0; index < va_num_entrypoints; index ++) { 353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_entrypoints[index] == VAEntrypointEncSlice) { 354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (index == va_num_entrypoints) { 359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Entrypoint not found\n"); 360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; //Todo, add error handling here 364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*free profiles and entrypoints*/ 368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(va_profiles); 369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (va_entrypoints); 370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[0].type = VAConfigAttribRTFormat; 372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[1].type = VAConfigAttribRateControl; 373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaGetConfigAttributes\n"); 375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaGetConfigAttributes(va_display, parent->va_profile, 377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_entrypoint, 378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &va_attrib[0], 2); 379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to call vaGetConfigAttributes\n"); 384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((va_attrib[0].value & parent->va_format) == 0) { 389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Matched format not found\n"); 390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; //Todo, add error handling here 392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((va_attrib[1].value & parent->va_rcmode) == 0) { 396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "RC mode not found\n"); 397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; //Todo, add error handling here 399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[0].value = parent->va_format; //VA_RT_FORMAT_YUV420; 402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[1].value = parent->va_rcmode; 403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "======VA Configuration======\n"); 405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "profile = %d\n", 407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_profile); 408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_entrypoint = %d\n", 409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_entrypoint); 410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_attrib[0].type = %d\n", 411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[0].type); 412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_attrib[1].type = %d\n", 413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[1].type); 414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_attrib[0].value (Format) = %d\n", 415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[0].value); 416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_attrib[1].value (RC mode) = %d\n", 417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_attrib[1].value); 418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaCreateConfig\n"); 420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateConfig(va_display, parent->va_profile, 422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->va_entrypoint, 423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &va_attrib[0], 2, &(parent->va_config)); 424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed vaCreateConfig\n"); 428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*TODO: compute the surface number*/ 433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int numSurfaces; 434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->share_buf_mode) { 436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee numSurfaces = 2; 437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee numSurfaces = 8; 440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->ci_frame_num = 0; 441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surface_num = numSurfaces + parent->ci_frame_num; 444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee surfaces = g_malloc(sizeof(VASurfaceID)*numSurfaces); 446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (surfaces == NULL) 448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed allocate surface\n"); 451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaCreateSurfaces\n"); 456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateSurfaces(va_display, parent->picture_width, 458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->picture_height, parent->va_format, 459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee numSurfaces, surfaces); 460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO check vret and return fail if needed 461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed vaCreateSurfaces\n"); 466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->share_buf_mode) { 471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "We are in share buffer mode!\n"); 474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ci_shared_surfaces = 475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_malloc(sizeof(VASurfaceID) * parent->ci_frame_num); 476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->ci_shared_surfaces == NULL) 478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed allocate shared surface\n"); 481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint index; 486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(index = 0; index < parent->ci_frame_num; index++) { 487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "ci_frame_id = %lu\n", 489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->ci_frame_id[index]); 490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "vaCreateSurfaceFromCIFrame\n"); 493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateSurfaceFromCIFrame(va_display, 495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (gulong) (parent->ci_frame_id[index]), 496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &self->ci_shared_surfaces[index]); 497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaCreateSurfaceFromCIFrame\n"); 501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "vaCreateSurfaceFromCIFrame Done\n"); 508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }// if (parent->share_buf_mode) 510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces = g_malloc(sizeof(VASurfaceID) * self->surface_num); 512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->surfaces == NULL) 514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed allocate private surface\n"); 517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->share_buf_mode) { 523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*shared surfaces should be put in pool first, 524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * because we will get it accoring to CI index*/ 525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(index = 0; index < parent->ci_frame_num; index++) 526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces[index] = self->ci_shared_surfaces[index]; 527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(index = 0; index < numSurfaces; index++) { 530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces[index + parent->ci_frame_num] = surfaces[index]; 531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "assign surface Done\n"); 534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "Created %d libva surfaces\n", 535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee numSurfaces + parent->ci_frame_num); 536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 //current put this in gst 538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee images = g_malloc(sizeof(VAImage)*numSurfaces); 539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (images == NULL) 540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (index = 0; index < numSurfaces; index++) { 546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Derive an VAImage from an existing surface. 547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //The image buffer can then be mapped/unmapped for CPU access 548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDeriveImage(va_display, surfaces[index], 549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &images[index]); 550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "mix_surfacepool_new\n"); 554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->surfacepool = mix_surfacepool_new(); 556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (surface_pool) 557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *surface_pool = parent->surfacepool; 558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //which is useful to check before encode 559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->surfacepool == NULL) 561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_surfacepool_new\n"); 564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix_surfacepool_initialize\n"); 571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_initialize(parent->surfacepool, 573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces, parent->ci_frame_num + numSurfaces); 574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch (ret) 576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case MIX_RESULT_SUCCESS: 578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case MIX_RESULT_ALREADY_INIT: 580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO cleanup and/or retry 581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: 585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Initialize and save the VA context ID 590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaCreateContext\n"); 591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateContext(va_display, parent->va_config, 593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->picture_width, parent->picture_height, 594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VA_PROGRESSIVE, self->surfaces, parent->ci_frame_num + numSurfaces, 595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &(parent->va_context)); 596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Created libva context width %d, height %d\n", 599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->picture_width, parent->picture_height); 600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaCreateContext\n"); 605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_status = %d\n", 606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint)va_status); 607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint max_size = 0; 613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_mpeg4_get_max_encoded_buf_size (parent, &max_size); 614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_videofmtenc_mpeg4_get_max_encoded_buf_size\n"); 618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*Create coded buffer for output*/ 625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateBuffer (va_display, parent->va_context, 626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEncCodedBufferType, 627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->coded_buf_size, // 628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1, NULL, 629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &self->coded_buf); 630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaCreateBuffer: VAEncCodedBufferType\n"); 635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef SHOW_SRC 641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Display * display = XOpenDisplay (NULL); 642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "display = 0x%08x\n", 644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint) display); 645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee win = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, 646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->picture_width, parent->picture_height, 0, 0, 647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee WhitePixel(display, 0)); 648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee XMapWindow(display, win); 649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee XSelectInput(display, win, KeyPressMask | StructureNotifyMask); 650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee XSync(display, False); 652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_display = 0x%08x\n", 653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint) va_display); 654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif /* SHOW_SRC */ 656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->initialized = TRUE; 658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (surfaces); 661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not MPEG4 video encode Object\n"); 667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 676bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_encode(MixVideoFormatEnc *mix, MixBuffer * bufin[], 677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint bufincnt, MixIOVec * iovout[], gint iovoutcnt, 678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoEncodeParams * encode_params) { 679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_SUCCESS; 681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*currenly only support one input and output buffer*/ 686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO: params i 687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (bufincnt != 1 || iovoutcnt != 1) { 689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "buffer count not equel to 1\n"); 691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "maybe some exception occurs\n"); 693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL ||bufin[0] == NULL || iovout[0] == NULL) { 696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "!mix || !bufin[0] ||!iovout[0]\n"); 698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO: encode_params is reserved here for future usage. 702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: decide if we need to chainup parent method. 704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * * * if we do, the following is the code: 705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * */ 706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->encode) { 709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->encode(mix, bufin, bufincnt, iovout, 710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee iovoutcnt, encode_params); 711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_MPEG4(mix)) 715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(&(mix->parent)); 718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4 (mix); 719bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 720bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Locking\n"); 721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(parent->objectlock); 722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //TODO: also we could move some encode Preparation work to here 725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix_videofmtenc_mpeg4_process_encode\n"); 728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_mpeg4_process_encode (self, 730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee bufin[0], iovout[0]); 731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed mix_videofmtenc_mpeg4_process_encode\n"); 735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "UnLocking\n"); 740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not MPEG4 video encode Object\n"); 747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 755bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_flush(MixVideoFormatEnc *mix) { 756bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //MIX_RESULT ret = MIX_RESULT_SUCCESS; 758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) { 762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "mix == NULL\n"); 763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*not chain to parent flush func*/ 768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->flush) { 770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->flush(mix, msg); 771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4(mix); 775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(mix->objectlock); 777bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the current source surface*/ 779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->cur_fame != NULL) 780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->cur_fame); 782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->cur_fame = NULL; 783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the reconstructed surface*/ 786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->rec_fame != NULL) 787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->rec_fame); 789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->rec_fame = NULL; 790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the reference surface*/ 793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->ref_fame != NULL) 794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->ref_fame); 796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ref_fame = NULL; 797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*reset the properities*/ 800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->encoded_frames = 0; 801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->pic_skipped = FALSE; 802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->is_intra = TRUE; 803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(mix->objectlock); 805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 811bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_eos(MixVideoFormatEnc *mix) { 812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: add codes for MPEG-4:2 */ 814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* TODO: decide if we need to chainup parent method. 816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * if we do, the following is the code: 817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "\n"); 820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) { 822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "mix == NULL\n"); 823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->eos) { 827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->eos(mix); 828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 832bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_deinitialize(MixVideoFormatEnc *mix) { 833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status; 836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) { 840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "mix == NULL\n"); 841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(&(mix->parent)); 845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4(mix); 846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Release frames\n"); 848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(parent->objectlock); 850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the current source surface*/ 853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->cur_fame != NULL) 854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->cur_fame); 856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->cur_fame = NULL; 857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the reconstructed surface*/ 861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->rec_fame != NULL) 862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->rec_fame); 864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->rec_fame = NULL; 865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*unref the reference surface*/ 868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->ref_fame != NULL) 869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (self->ref_fame); 871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ref_fame = NULL; 872bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 873bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Release surfaces\n"); 875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->ci_shared_surfaces) 877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (self->ci_shared_surfaces); 879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->ci_shared_surfaces = NULL; 880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->surfaces) 883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free (self->surfaces); 885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfaces = NULL; 886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaDestroyContext\n"); 889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDestroyContext (parent->va_display, parent->va_context); 891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed vaDestroyContext\n"); 895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaDestroyConfig\n"); 900bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDestroyConfig (parent->va_display, parent->va_config); 902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed vaDestroyConfig\n"); 906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent->initialized = TRUE; 911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(parent->objectlock); 913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 914bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1 915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->deinitialize) { 916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return parent_class->deinitialize(mix); 917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Most stuff is cleaned up in parent_class->finalize() 921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 925bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 927bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_send_seq_params (MixVideoFormatEnc_MPEG4 *mix) 928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status; 931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEncSequenceParameterBufferMPEG4 mpeg4_seq_param; 932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VABufferID seq_para_buf_id; 933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) 938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n\n"); 941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_MPEG4(mix)) 943bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(&(mix->parent)); 945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*set up the sequence params for HW*/ 947bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.profile_and_level_indication = mix->profile_and_level_indication; //TODO, hard code now 948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.video_object_layer_width= parent->picture_width; 949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.video_object_layer_height= parent->picture_height; 950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.vop_time_increment_resolution = 951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (unsigned int) (parent->frame_rate_num + parent->frame_rate_denom /2 ) / parent->frame_rate_denom; 952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.fixed_vop_time_increment= mix->fixed_vop_time_increment; 953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.bits_per_second= parent->bitrate; 954bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.frame_rate = 955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (unsigned int) (parent->frame_rate_num + parent->frame_rate_denom /2 ) / parent->frame_rate_denom; 956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.initial_qp = parent->initial_qp; 957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.min_qp = parent->min_qp; 958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.intra_period = parent->intra_period; 959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //mpeg4_seq_param.fixed_vop_rate = 30; 962bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "===mpeg4 sequence params===\n"); 967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "profile_and_level_indication = %d\n", 969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint)mpeg4_seq_param.profile_and_level_indication); 970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "intra_period = %d\n", 971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.intra_period); 972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "video_object_layer_width = %d\n", 973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.video_object_layer_width); 974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "video_object_layer_height = %d\n", 975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.video_object_layer_height); 976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "vop_time_increment_resolution = %d\n", 977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.vop_time_increment_resolution); 978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "fixed_vop_rate = %d\n", 979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.fixed_vop_rate); 980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "fixed_vop_time_increment = %d\n", 981bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.fixed_vop_time_increment); 982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "bitrate = %d\n", 983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.bits_per_second); 984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "frame_rate = %d\n", 985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.frame_rate); 986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "initial_qp = %d\n", 987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.initial_qp); 988bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "min_qp = %d\n", 989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.min_qp); 990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "intra_period = %d\n\n", 991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_seq_param.intra_period); 992bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateBuffer(parent->va_display, parent->va_context, 994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEncSequenceParameterBufferType, 995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sizeof(mpeg4_seq_param), 996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1, &mpeg4_seq_param, 997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &seq_para_buf_id); 998bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaCreateBuffer\n"); 1002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaRenderPicture(parent->va_display, parent->va_context, 1006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &seq_para_buf_id, 1); 1007bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaRenderPicture\n"); 1011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_status = %d\n", va_status); 1012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1018bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not MPEG4 video encode Object\n"); 1019bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1021bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 1023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 1025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1029bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_send_picture_parameter (MixVideoFormatEnc_MPEG4 *mix) 1030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status; 1032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEncPictureParameterBufferMPEG4 mpeg4_pic_param; 1033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 1034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) 1036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n\n"); 1039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 //not needed currently 1041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsEncMPEG4 * params_mpeg4 1042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee = MIX_VIDEOCONFIGPARAMSENC_MPEG4 (config_params_enc); 1043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 1044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_MPEG4(mix)) { 1046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(&(mix->parent)); 1048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*set picture params for HW*/ 1050bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.reference_picture = mix->ref_fame->frame_id; 1051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.reconstructed_picture = mix->rec_fame->frame_id; 1052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.coded_buf = mix->coded_buf; 1053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.picture_width = parent->picture_width; 1054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.picture_height = parent->picture_height; 1055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.vop_time_increment= mix->encoded_frames; 1056bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.picture_type = mix->is_intra ? VAEncPictureTypeIntra : VAEncPictureTypePredictive; 1057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "======mpeg4 picture params======\n"); 1062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "reference_picture = 0x%08x\n", 1063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.reference_picture); 1064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "reconstructed_picture = 0x%08x\n", 1065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.reconstructed_picture); 1066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "coded_buf = 0x%08x\n", 1067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.coded_buf); 1068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "picture_width = %d\n", 1069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.picture_width); 1070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "picture_height = %d\n", 1071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.picture_height); 1072bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "vop_time_increment = %d\n", 1073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.vop_time_increment); 1074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "picture_type = %d\n\n", 1075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mpeg4_pic_param.picture_type); 1076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateBuffer(parent->va_display, parent->va_context, 1078bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEncPictureParameterBufferType, 1079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sizeof(mpeg4_pic_param), 1080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1,&mpeg4_pic_param, 1081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &mix->pic_param_buf); 1082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaCreateBuffer\n"); 1087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1090bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaRenderPicture(parent->va_display, parent->va_context, 1092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &mix->pic_param_buf, 1); 1093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaRenderPicture\n"); 1098bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_status = %d\n", va_status); 1099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not MPEG4 video encode Object\n"); 1106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 1110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 1111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1115bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_send_slice_parameter (MixVideoFormatEnc_MPEG4 *mix) 1116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status; 1118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint slice_height; 1120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint slice_index; 1121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint slice_height_in_mb; 1122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) 1124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n\n"); 1127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 1130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_MPEG4(mix)) 1132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(&(mix->parent)); 1134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee slice_height = parent->picture_height; 1136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee slice_height += 15; 1138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee slice_height &= (~15); 1139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEncSliceParameterBuffer slice_param; 1141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee slice_index = 0; 1142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee slice_height_in_mb = slice_height / 16; 1143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee slice_param.start_row_number = 0; 1144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee slice_param.slice_height = slice_height / 16; 1145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee slice_param.slice_flags.bits.is_intra = mix->is_intra; 1146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee slice_param.slice_flags.bits.disable_deblocking_filter_idc 1147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee = mix->disable_deblocking_filter_idc; 1148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "======mpeg4 slice params======\n"); 1151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "start_row_number = %d\n", 1153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (gint) slice_param.start_row_number); 1154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "slice_height_in_mb = %d\n", 1155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (gint) slice_param.slice_height); 1156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "slice.is_intra = %d\n", 1157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (gint) slice_param.slice_flags.bits.is_intra); 1158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "disable_deblocking_filter_idc = %d\n\n", 1160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (gint) mix->disable_deblocking_filter_idc); 1161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaCreateBuffer (parent->va_display, parent->va_context, 1163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAEncSliceParameterBufferType, 1164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sizeof(VAEncSliceParameterBuffer), 1165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1, &slice_param, 1166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &mix->slice_param_buf); 1167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaCreateBuffer\n"); 1172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaRenderPicture(parent->va_display, parent->va_context, 1176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee &mix->slice_param_buf, 1); 1177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaRenderPicture\n"); 1182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not MPEG4 video encode Object\n"); 1190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 1194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 1196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1198bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_process_encode (MixVideoFormatEnc_MPEG4 *mix, 1199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBuffer * bufin, MixIOVec * iovout) 1200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT ret = MIX_RESULT_SUCCESS; 1203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status = VA_STATUS_SUCCESS; 1204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VADisplay va_display = NULL; 1205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAContextID va_context; 1206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gulong surface = 0; 1207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint16 width, height; 1208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFrame * tmp_fame; 1210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint8 *buf; 1211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((mix == NULL) || (bufin == NULL) || (iovout == NULL)) { 1213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix == NUL) || bufin == NULL || iovout == NULL\n"); 1215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_MPEG4(mix)) 1221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = MIX_VIDEOFORMATENC(&(mix->parent)); 1224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_display = parent->va_display; 1226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_context = parent->va_context; 1227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee width = parent->picture_width; 1228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee height = parent->picture_height; 1229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "encoded_frames = %d\n", 1232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->encoded_frames); 1233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "is_intra = %d\n", 1234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->is_intra); 1235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "ci_frame_id = 0x%08x\n", 1236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (guint) parent->ci_frame_id); 1237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* determine the picture type*/ 1239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((mix->encoded_frames % parent->intra_period) == 0) { 1240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->is_intra = TRUE; 1241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 1242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->is_intra = FALSE; 1243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "is_intra_picture = %d\n", 1246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->is_intra); 1247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Get Surface from the pool\n"); 1250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*current we use one surface for source data, 1252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * one for reference and one for reconstructed*/ 1253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*TODO, could be refine here*/ 1254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!parent->share_buf_mode) { 1256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "We are NOT in share buffer mode\n"); 1258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->ref_fame == NULL) 1260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get(parent->surfacepool, &mix->ref_fame); 1262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) //#ifdef SLEEP_SURFACE not used 1263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_surfacepool_get\n"); 1266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->rec_fame == NULL) 1271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get(parent->surfacepool, &mix->rec_fame); 1273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_surfacepool_get\n"); 1277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->need_display) { 1282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->cur_fame = NULL; 1283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->cur_fame == NULL) 1286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get(parent->surfacepool, &mix->cur_fame); 1288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_surfacepool_get\n"); 1292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Get Surface Done\n"); 1297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAImage src_image; 1300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint8 *pvbuf; 1301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint8 *dst_y; 1302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint8 *dst_uv; 1303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int i,j; 1304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "map source data to surface\n"); 1307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_get_frame_id(mix->cur_fame, &surface); 1309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to mix_videoframe_get_frame_id\n"); 1313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "surface id = 0x%08x\n", (guint) surface); 1319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDeriveImage(va_display, surface, &src_image); 1321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //need to destroy 1322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaDeriveImage\n"); 1327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAImage *image = &src_image; 1331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaDeriveImage Done\n"); 1333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaMapBuffer (va_display, image->buf, (void **)&pvbuf); 1336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed to vaMapBuffer\n"); 1339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "vaImage information\n"); 1344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->pitches[0] = %d\n", image->pitches[0]); 1346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->pitches[1] = %d\n", image->pitches[1]); 1348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->offsets[0] = %d\n", image->offsets[0]); 1350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->offsets[1] = %d\n", image->offsets[1]); 1352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->num_planes = %d\n", image->num_planes); 1354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->width = %d\n", image->width); 1356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "image->height = %d\n", image->height); 1358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "input buf size = %d\n", bufin->size); 1361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint8 *inbuf = bufin->data; 1363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*need to convert YUV420 to NV12*/ 1365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_y = pvbuf +image->offsets[0]; 1366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; i < height; i ++) { 1368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee memcpy (dst_y, inbuf + i * width, width); 1369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_y += image->pitches[0]; 1370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_uv = pvbuf + image->offsets[1]; 1373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; i < height / 2; i ++) { 1375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (j = 0; j < width; j+=2) { 1376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_uv [j] = inbuf [width * height + i * width / 2 + j / 2]; 1377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_uv [j + 1] = 1378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee inbuf [width * height * 5 / 4 + i * width / 2 + j / 2]; 1379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dst_uv += image->pitches[1]; 1381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vaUnmapBuffer(va_display, image->buf); 1384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaUnmapBuffer\n"); 1388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDestroyImage(va_display, src_image.image_id); 1392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed to vaDestroyImage\n"); 1396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Map source data to surface done\n"); 1401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else {//if (!parent->share_buf_mode) 1405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFrame * frame = mix_videoframe_new(); 1407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->ref_fame == NULL) 1409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_set_ci_frame_idx (frame, mix->surface_num - 1); 1411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get_frame_with_ci_frameidx 1413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (parent->surfacepool, &mix->ref_fame, frame); 1414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) //#ifdef SLEEP_SURFACE not used 1415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "get reference surface from pool failed\n"); 1418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->rec_fame == NULL) 1423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_set_ci_frame_idx (frame, mix->surface_num - 2); 1425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get_frame_with_ci_frameidx 1427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (parent->surfacepool, &mix->rec_fame, frame); 1428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "get recontructed surface from pool failed\n"); 1433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->need_display) { 1438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->cur_fame = NULL; 1439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->cur_fame == NULL) 1442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee guint ci_idx; 1444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee memcpy (&ci_idx, bufin->data, bufin->size); 1445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "surface_num = %d\n", mix->surface_num); 1448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "ci_frame_idx = %d\n", ci_idx); 1450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ci_idx > mix->surface_num - 2) { 1452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "the CI frame idx is too bigger than CI frame number\n"); 1454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_set_ci_frame_idx (frame, ci_idx); 1459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_surfacepool_get_frame_with_ci_frameidx 1461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (parent->surfacepool, &mix->cur_fame, frame); 1462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "get current working surface from pool failed\n"); 1467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videoframe_get_frame_id(mix->cur_fame, &surface); 1472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaBeginPicture\n"); 1476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_context = 0x%08x\n",(guint)va_context); 1477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "surface = 0x%08x\n",(guint)surface); 1478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( "va_display = 0x%08x\n",(guint)va_display); 1479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaBeginPicture(va_display, va_context, surface); 1481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed vaBeginPicture\n"); 1484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "mix_videofmtenc_mpeg4_send_seq_params\n"); 1488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->encoded_frames == 0) { 1490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videofmtenc_mpeg4_send_seq_params (mix); 1491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed mix_videofmtenc_mpeg4_send_seq_params\n"); 1495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_mpeg4_send_picture_parameter (mix); 1500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed mix_videofmtenc_mpeg4_send_picture_parameter\n"); 1505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_videofmtenc_mpeg4_send_slice_parameter (mix); 1509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed mix_videofmtenc_mpeg4_send_slice_parameter\n"); 1513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "before vaEndPicture\n"); 1517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaEndPicture (va_display, va_context); 1519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed vaEndPicture\n"); 1522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "vaSyncSurface\n"); 1527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaSyncSurface(va_display, surface); 1529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed vaSyncSurface\n"); 1532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( 1537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Start to get encoded data\n"); 1538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*get encoded data from the VA buffer*/ 1540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaMapBuffer (va_display, mix->coded_buf, (void **)&buf); 1541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed vaMapBuffer\n"); 1544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // first 4 bytes is the size of the buffer 1548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee memcpy (&(iovout->data_size), (void*)buf, 4); 1549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //size = (guint*) buf; 1550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (iovout->data == NULL) { //means app doesn't allocate the buffer, so _encode will allocate it. 1552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee iovout->data = g_malloc (iovout->data_size); 1554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (iovout->data == NULL) { 1555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NO_MEMORY; 1556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee memcpy (iovout->data, buf + 16, iovout->data_size); 1560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee iovout->buffer_size = iovout->data_size; 1562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_I( 1564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "out size is = %d\n", iovout->data_size); 1565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaUnmapBuffer (va_display, mix->coded_buf); 1567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Failed vaUnmapBuffer\n"); 1570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "get encoded data done\n"); 1574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 1576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->drawable) { 1577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaPutSurface(va_display, surface, (Drawable)parent->drawable, 1578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 0,0, width, height, 1579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 0,0, width, height, 1580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee NULL,0,0); 1581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef SHOW_SRC 1584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 1585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaPutSurface(va_display, surface, win, 1587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 0,0, width, height, 1588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 0,0, width, height, 1589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee NULL,0,0); 1590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif //SHOW_SRC 1592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 1593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VASurfaceStatus status; 1595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*query the status of current surface*/ 1597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaQuerySurfaceStatus(va_display, surface, &status); 1598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) 1599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed vaQuerySurfaceStatus\n"); 1602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->pic_skipped = status & VASurfaceSkipped; 1605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //ret = mix_framemanager_enqueue(parent->framemgr, mix->rec_fame); 1607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent->need_display) { 1609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = mix_framemanager_enqueue(parent->framemgr, mix->cur_fame); 1610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (ret != MIX_RESULT_SUCCESS) 1611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "Failed mix_framemanager_enqueue\n"); 1614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*update the reference surface and reconstructed surface */ 1620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix->pic_skipped) { 1621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee tmp_fame = mix->rec_fame; 1622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->rec_fame= mix->ref_fame; 1623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->ref_fame = tmp_fame; 1624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 1628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->ref_fame != NULL) 1629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (mix->ref_fame); 1630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->ref_fame = mix->rec_fame; 1631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (mix->cur_fame); 1633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 1634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(parent->need_display)) { 1636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videoframe_unref (mix->cur_fame); 1637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->cur_fame = NULL; 1638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->encoded_frames ++; 1641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not MPEG4 video encode Object\n"); 1646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 1651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 1653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1655bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_get_max_encoded_buf_size ( 1656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *mix, guint * max_size) 1657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc *parent = NULL; 1660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix == NULL) 1662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "mix == NULL\n"); 1665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NULL_PTR; 1666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 1669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent = MIX_VIDEOFORMATENC(mix); 1671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4 (mix); 1672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MIX_IS_VIDEOFORMATENC_MPEG4(self)) { 1674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->coded_buf_size > 0) { 1676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *max_size = self->coded_buf_size; 1677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V ("Already calculate the max encoded size, get the value directly"); 1678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 1679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*base on the rate control mode to calculate the defaule encoded buffer size*/ 1682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (self->va_rcmode == VA_RC_NONE) { 1683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->coded_buf_size = 1684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (parent->picture_width* parent->picture_height * 400) / (16 * 16); 1685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // set to value according to QP 1686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 1688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->coded_buf_size = parent->bitrate/ 4; 1689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->coded_buf_size = 1692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee max (self->coded_buf_size , 1693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (parent->picture_width* parent->picture_height * 400) / (16 * 16)); 1694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*in case got a very large user input bit rate value*/ 1696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->coded_buf_size = 1697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee max(self->coded_buf_size, 1698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (parent->picture_width * parent->picture_height * 1.5 * 8)); 1699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->coded_buf_size = (self->coded_buf_size + 15) &(~15); 1700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( 1704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee "not MPEG4 video encode Object\n"); 1705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 1706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *max_size = self->coded_buf_size; 1709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "end\n"); 1711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 1713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1714