Home | History | Annotate | Download | only in videoencoder
      1 /*
      2 * Copyright (c) 2009-2011 Intel Corporation.  All rights reserved.
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 * http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 
     17 #include <string.h>
     18 #include <stdlib.h>
     19 #include "VideoEncoderLog.h"
     20 #include "VideoEncoderH263.h"
     21 #include <va/va_tpi.h>
     22 
     23 VideoEncoderH263::VideoEncoderH263() {
     24     mComParams.profile = (VAProfile)PROFILE_H263BASELINE;
     25     mAutoReferenceSurfaceNum = 2;
     26 }
     27 
     28 Encode_Status VideoEncoderH263::sendEncodeCommand(EncodeTask *task) {
     29 
     30     Encode_Status ret = ENCODE_SUCCESS;
     31     LOG_V( "Begin\n");
     32 
     33     if (mFrameNum == 0) {
     34         ret = renderSequenceParams(task);
     35         CHECK_ENCODE_STATUS_RETURN("renderSequenceParams");
     36     }
     37 
     38     ret = renderPictureParams(task);
     39     CHECK_ENCODE_STATUS_RETURN("renderPictureParams");
     40 
     41     ret = renderSliceParams(task);
     42     CHECK_ENCODE_STATUS_RETURN("renderSliceParams");
     43 
     44     LOG_V( "End\n");
     45     return ENCODE_SUCCESS;
     46 }
     47 
     48 
     49 Encode_Status VideoEncoderH263::renderSequenceParams(EncodeTask *) {
     50 
     51     VAStatus vaStatus = VA_STATUS_SUCCESS;
     52     VAEncSequenceParameterBufferH263 h263SequenceParam = VAEncSequenceParameterBufferH263();
     53     uint32_t frameRateNum = mComParams.frameRate.frameRateNum;
     54     uint32_t frameRateDenom = mComParams.frameRate.frameRateDenom;
     55 
     56     LOG_V( "Begin\n\n");
     57     //set up the sequence params for HW
     58     h263SequenceParam.bits_per_second= mComParams.rcParams.bitRate;
     59     h263SequenceParam.frame_rate =
     60             (unsigned int) (frameRateNum + frameRateDenom /2) / frameRateDenom;   //hard-coded, driver need;
     61     h263SequenceParam.initial_qp = mComParams.rcParams.initQP;
     62     h263SequenceParam.min_qp = mComParams.rcParams.minQP;
     63     h263SequenceParam.intra_period = mComParams.intraPeriod;
     64 
     65     //h263_seq_param.fixed_vop_rate = 30;
     66 
     67     LOG_V("===h263 sequence params===\n");
     68     LOG_I( "bitrate = %d\n", h263SequenceParam.bits_per_second);
     69     LOG_I( "frame_rate = %d\n", h263SequenceParam.frame_rate);
     70     LOG_I( "initial_qp = %d\n", h263SequenceParam.initial_qp);
     71     LOG_I( "min_qp = %d\n", h263SequenceParam.min_qp);
     72     LOG_I( "intra_period = %d\n\n", h263SequenceParam.intra_period);
     73 
     74     vaStatus = vaCreateBuffer(
     75             mVADisplay, mVAContext,
     76             VAEncSequenceParameterBufferType,
     77             sizeof(h263SequenceParam),
     78             1, &h263SequenceParam,
     79             &mSeqParamBuf);
     80     CHECK_VA_STATUS_RETURN("vaCreateBuffer");
     81 
     82     vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mSeqParamBuf, 1);
     83     CHECK_VA_STATUS_RETURN("vaRenderPicture");
     84 
     85     LOG_V( "end\n");
     86     return ENCODE_SUCCESS;
     87 }
     88 
     89 Encode_Status VideoEncoderH263::renderPictureParams(EncodeTask *task) {
     90 
     91     VAStatus vaStatus = VA_STATUS_SUCCESS;
     92     VAEncPictureParameterBufferH263 h263PictureParams = VAEncPictureParameterBufferH263();
     93 
     94     LOG_V( "Begin\n\n");
     95 
     96     // set picture params for HW
     97     if(mAutoReference == false){
     98         h263PictureParams.reference_picture = task->ref_surface;
     99         h263PictureParams.reconstructed_picture = task->rec_surface;
    100     }else {
    101         h263PictureParams.reference_picture = mAutoRefSurfaces[0];
    102         h263PictureParams.reconstructed_picture = mAutoRefSurfaces[1];
    103     }
    104 
    105     h263PictureParams.coded_buf = task->coded_buffer;
    106     h263PictureParams.picture_width = mComParams.resolution.width;
    107     h263PictureParams.picture_height = mComParams.resolution.height;
    108     h263PictureParams.picture_type = (task->type == FTYPE_I) ? VAEncPictureTypeIntra : VAEncPictureTypePredictive;
    109 
    110     LOG_V("======h263 picture params======\n");
    111     LOG_V( "reference_picture = 0x%08x\n", h263PictureParams.reference_picture);
    112     LOG_V( "reconstructed_picture = 0x%08x\n", h263PictureParams.reconstructed_picture);
    113     LOG_V( "coded_buf = 0x%08x\n", h263PictureParams.coded_buf);
    114 //    LOG_I( "coded_buf_index = %d\n", mCodedBufIndex);
    115     LOG_V( "picture_width = %d\n", h263PictureParams.picture_width);
    116     LOG_V( "picture_height = %d\n",h263PictureParams.picture_height);
    117     LOG_V( "picture_type = %d\n\n",h263PictureParams.picture_type);
    118 
    119     vaStatus = vaCreateBuffer(
    120             mVADisplay, mVAContext,
    121             VAEncPictureParameterBufferType,
    122             sizeof(h263PictureParams),
    123             1,&h263PictureParams,
    124             &mPicParamBuf);
    125     CHECK_VA_STATUS_RETURN("vaCreateBuffer");
    126 
    127     vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mPicParamBuf , 1);
    128     CHECK_VA_STATUS_RETURN("vaRenderPicture");
    129 
    130     LOG_V( "end\n");
    131     return ENCODE_SUCCESS;
    132 }
    133 
    134 Encode_Status VideoEncoderH263::renderSliceParams(EncodeTask *task) {
    135 
    136     VAStatus vaStatus = VA_STATUS_SUCCESS;
    137     uint32_t sliceHeight;
    138     uint32_t sliceHeightInMB;
    139 
    140     LOG_V("Begin\n\n");
    141 
    142     sliceHeight = mComParams.resolution.height;
    143     sliceHeight += 15;
    144     sliceHeight &= (~15);
    145     sliceHeightInMB = sliceHeight / 16;
    146 
    147     vaStatus = vaCreateBuffer(
    148             mVADisplay, mVAContext,
    149             VAEncSliceParameterBufferType,
    150             sizeof(VAEncSliceParameterBuffer),
    151             1, NULL, &mSliceParamBuf);
    152     CHECK_VA_STATUS_RETURN("vaCreateBuffer");
    153 
    154     VAEncSliceParameterBuffer *sliceParams;
    155     vaStatus = vaMapBuffer(mVADisplay, mSliceParamBuf, (void **)&sliceParams);
    156     CHECK_VA_STATUS_RETURN("vaMapBuffer");
    157 
    158     // starting MB row number for this slice
    159     sliceParams->start_row_number = 0;
    160     // slice height measured in MB
    161     sliceParams->slice_height = sliceHeightInMB;
    162     sliceParams->slice_flags.bits.is_intra = (task->type == FTYPE_I)?1:0;
    163     sliceParams->slice_flags.bits.disable_deblocking_filter_idc = 0;
    164 
    165     LOG_V("======h263 slice params======\n");
    166     LOG_V("start_row_number = %d\n", (int) sliceParams->start_row_number);
    167     LOG_V("slice_height_in_mb = %d\n", (int) sliceParams->slice_height);
    168     LOG_V("slice.is_intra = %d\n", (int) sliceParams->slice_flags.bits.is_intra);
    169 
    170     vaStatus = vaUnmapBuffer(mVADisplay, mSliceParamBuf);
    171     CHECK_VA_STATUS_RETURN("vaUnmapBuffer");
    172 
    173     vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mSliceParamBuf, 1);
    174     CHECK_VA_STATUS_RETURN("vaRenderPicture");
    175 
    176     LOG_V("end\n");
    177     return ENCODE_SUCCESS;
    178 }
    179