182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON/* 282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Licensed under the Apache License, Version 2.0 (the "License"); 582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* you may not use this file except in compliance with the License. 682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* You may obtain a copy of the License at 782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* http://www.apache.org/licenses/LICENSE-2.0 982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 1082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Unless required by applicable law or agreed to in writing, software 1182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* distributed under the License is distributed on an "AS IS" BASIS, 1282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* See the License for the specific language governing permissions and 1482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* limitations under the License. 1582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON*/ 1682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <string.h> 1882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <stdlib.h> 1982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoEncoderLog.h" 2082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoEncoderH263.h" 2182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <va/va_tpi.h> 2282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 2382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVideoEncoderH263::VideoEncoderH263() { 2482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mComParams.profile = (VAProfile)PROFILE_H263BASELINE; 2582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mAutoReferenceSurfaceNum = 2; 2682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 2782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 2882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderH263::sendEncodeCommand(EncodeTask *task) { 2982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 3082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 3182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n"); 3282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 3382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mFrameNum == 0) { 3482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderSequenceParams(task); 3582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderSequenceParams"); 3682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 3782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 3882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderPictureParams(task); 3982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderPictureParams"); 4082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 4182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderSliceParams(task); 4282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderSliceParams"); 4382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 4482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "End\n"); 4582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 4682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 4782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 4882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 4982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderH263::renderSequenceParams(EncodeTask *) { 5082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 5182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 5282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncSequenceParameterBufferH263 h263SequenceParam = VAEncSequenceParameterBufferH263(); 5382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t frameRateNum = mComParams.frameRate.frameRateNum; 5482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t frameRateDenom = mComParams.frameRate.frameRateDenom; 5582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 5682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n\n"); 5782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //set up the sequence params for HW 5882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263SequenceParam.bits_per_second= mComParams.rcParams.bitRate; 5982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263SequenceParam.frame_rate = 6082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (unsigned int) (frameRateNum + frameRateDenom /2) / frameRateDenom; //hard-coded, driver need; 6182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263SequenceParam.initial_qp = mComParams.rcParams.initQP; 6282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263SequenceParam.min_qp = mComParams.rcParams.minQP; 6382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263SequenceParam.intra_period = mComParams.intraPeriod; 6482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 6582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //h263_seq_param.fixed_vop_rate = 30; 6682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 6782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("===h263 sequence params===\n"); 6882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I( "bitrate = %d\n", h263SequenceParam.bits_per_second); 6982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I( "frame_rate = %d\n", h263SequenceParam.frame_rate); 7082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I( "initial_qp = %d\n", h263SequenceParam.initial_qp); 7182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I( "min_qp = %d\n", h263SequenceParam.min_qp); 7282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I( "intra_period = %d\n\n", h263SequenceParam.intra_period); 7382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 7482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer( 7582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVADisplay, mVAContext, 7682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncSequenceParameterBufferType, 7782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(h263SequenceParam), 7882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1, &h263SequenceParam, 7982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &mSeqParamBuf); 8082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 8182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mSeqParamBuf, 1); 8382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 8482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "end\n"); 8682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 8782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 8882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderH263::renderPictureParams(EncodeTask *task) { 9082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 9182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 9282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPictureParameterBufferH263 h263PictureParams = VAEncPictureParameterBufferH263(); 9382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 9482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n\n"); 9582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 9682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // set picture params for HW 9782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(mAutoReference == false){ 9882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263PictureParams.reference_picture = task->ref_surface; 9982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263PictureParams.reconstructed_picture = task->rec_surface; 10082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }else { 10182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263PictureParams.reference_picture = mAutoRefSurfaces[0]; 10282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263PictureParams.reconstructed_picture = mAutoRefSurfaces[1]; 10382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 10482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 10582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263PictureParams.coded_buf = task->coded_buffer; 10682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263PictureParams.picture_width = mComParams.resolution.width; 10782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263PictureParams.picture_height = mComParams.resolution.height; 10882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h263PictureParams.picture_type = (task->type == FTYPE_I) ? VAEncPictureTypeIntra : VAEncPictureTypePredictive; 10982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 11082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("======h263 picture params======\n"); 11167efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "reference_picture = 0x%08x\n", h263PictureParams.reference_picture); 11267efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "reconstructed_picture = 0x%08x\n", h263PictureParams.reconstructed_picture); 11367efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "coded_buf = 0x%08x\n", h263PictureParams.coded_buf); 11482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON// LOG_I( "coded_buf_index = %d\n", mCodedBufIndex); 11567efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "picture_width = %d\n", h263PictureParams.picture_width); 11667efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "picture_height = %d\n",h263PictureParams.picture_height); 11767efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "picture_type = %d\n\n",h263PictureParams.picture_type); 11882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 11982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer( 12082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVADisplay, mVAContext, 12182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPictureParameterBufferType, 12282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(h263PictureParams), 12382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1,&h263PictureParams, 12482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &mPicParamBuf); 12582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 12682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 12782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mPicParamBuf , 1); 12882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 12982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 13082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "end\n"); 13182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 13282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 13382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 13482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderH263::renderSliceParams(EncodeTask *task) { 13582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 13682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 13782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t sliceHeight; 13882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t sliceHeightInMB; 13982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 14082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("Begin\n\n"); 14182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 14282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceHeight = mComParams.resolution.height; 14382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceHeight += 15; 14482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceHeight &= (~15); 14582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceHeightInMB = sliceHeight / 16; 14682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 14782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer( 14882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVADisplay, mVAContext, 14982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncSliceParameterBufferType, 15082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(VAEncSliceParameterBuffer), 15182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1, NULL, &mSliceParamBuf); 15282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 15382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 15482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncSliceParameterBuffer *sliceParams; 15582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, mSliceParamBuf, (void **)&sliceParams); 15682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 15782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 15882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // starting MB row number for this slice 15982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceParams->start_row_number = 0; 16082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // slice height measured in MB 16182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceParams->slice_height = sliceHeightInMB; 16282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceParams->slice_flags.bits.is_intra = (task->type == FTYPE_I)?1:0; 16382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceParams->slice_flags.bits.disable_deblocking_filter_idc = 0; 16482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 16582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("======h263 slice params======\n"); 16667efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("start_row_number = %d\n", (int) sliceParams->start_row_number); 16767efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("slice_height_in_mb = %d\n", (int) sliceParams->slice_height); 16867efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("slice.is_intra = %d\n", (int) sliceParams->slice_flags.bits.is_intra); 16982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 17082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnmapBuffer(mVADisplay, mSliceParamBuf); 17182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 17282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 17382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mSliceParamBuf, 1); 17482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 17582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 17682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("end\n"); 17782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 17882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 179