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