Home | History | Annotate | Download | only in videocodec
      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 
     18 //#define LOG_NDEBUG 0
     19 #define LOG_TAG "OMXVideoDecoder"
     20 #include <wrs_omxil_core/log.h>
     21 #include "OMXVideoDecoderPAVC.h"
     22 
     23 // Be sure to have an equal string in VideoDecoderHost.cpp (libmix)
     24 static const char* PAVC_MIME_TYPE = "video/PAVC";
     25 #define INVALID_PTS (OMX_S64)-1
     26 
     27 
     28 OMXVideoDecoderPAVC::OMXVideoDecoderPAVC() {
     29     LOGV("OMXVideoDecoderPAVC is constructed.");
     30     mVideoDecoder = createVideoDecoder(PAVC_MIME_TYPE);
     31     if (!mVideoDecoder) {
     32         LOGE("createVideoDecoder failed for \"%s\"", PAVC_MIME_TYPE);
     33     }
     34 
     35     BuildHandlerList();
     36 }
     37 
     38 OMXVideoDecoderPAVC::~OMXVideoDecoderPAVC() {
     39     LOGV("OMXVideoDecoderPAVC is destructed.");
     40 }
     41 
     42 OMX_ERRORTYPE OMXVideoDecoderPAVC::InitInputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput) {
     43     // OMX_PARAM_PORTDEFINITIONTYPE
     44     paramPortDefinitionInput->nBufferCountActual = INPORT_ACTUAL_BUFFER_COUNT;
     45     paramPortDefinitionInput->nBufferCountMin = INPORT_MIN_BUFFER_COUNT;
     46     paramPortDefinitionInput->nBufferSize = INPORT_BUFFER_SIZE;
     47     paramPortDefinitionInput->format.video.cMIMEType = (OMX_STRING)PAVC_MIME_TYPE;
     48     paramPortDefinitionInput->format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
     49 
     50     // OMX_VIDEO_PARAM_AVCTYPE
     51     memset(&mParamAvc, 0, sizeof(mParamAvc));
     52     SetTypeHeader(&mParamAvc, sizeof(mParamAvc));
     53     mParamAvc.nPortIndex = INPORT_INDEX;
     54     // TODO: check eProfile/eLevel
     55     mParamAvc.eProfile = OMX_VIDEO_AVCProfileMain; //OMX_VIDEO_AVCProfileBaseline;
     56     mParamAvc.eLevel = OMX_VIDEO_AVCLevel41; //OMX_VIDEO_AVCLevel1;
     57 
     58     mCurrentProfile = mParamAvc.eProfile;
     59     mCurrentLevel = mParamAvc.eLevel;
     60 
     61     return OMX_ErrorNone;
     62 }
     63 
     64 OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorInit(void) {
     65     return OMXVideoDecoderBase::ProcessorInit();
     66 }
     67 
     68 OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorDeinit(void) {
     69     return OMXVideoDecoderBase::ProcessorDeinit();
     70 }
     71 
     72 OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorFlush(OMX_U32 portIndex) {
     73     return OMXVideoDecoderBase::ProcessorFlush(portIndex);
     74 }
     75 
     76 OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorProcess(
     77         OMX_BUFFERHEADERTYPE ***pBuffers,
     78         buffer_retain_t *retains,
     79         OMX_U32 numberBuffers) {
     80 
     81     return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers);
     82 }
     83 
     84 OMX_ERRORTYPE OMXVideoDecoderPAVC::PrepareConfigBuffer(VideoConfigBuffer *p) {
     85     OMX_ERRORTYPE ret;
     86     ret = OMXVideoDecoderBase::PrepareConfigBuffer(p);
     87     CHECK_RETURN_VALUE("OMXVideoDecoderBase::PrepareConfigBuffer");
     88     p->width = 1920;
     89     p->height = 1088;
     90     p->surfaceNumber = 16;
     91     p->profile = VAProfileH264High;
     92     p->flag =  WANT_SURFACE_PROTECTION | HAS_VA_PROFILE | HAS_SURFACE_NUMBER;
     93     return OMX_ErrorNone;
     94 }
     95 
     96 OMX_ERRORTYPE OMXVideoDecoderPAVC::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p) {
     97     OMX_ERRORTYPE ret;
     98     ret = OMXVideoDecoderBase::PrepareDecodeBuffer(buffer, retain, p);
     99     CHECK_RETURN_VALUE("OMXVideoDecoderBase::PrepareDecodeBuffer");
    100 
    101     // OMX_BUFFERFLAG_CODECCONFIG is an optional flag
    102     // if flag is set, buffer will only contain codec data.
    103     if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
    104         LOGV("Received codec data for Protected AVC.");
    105         return ret;
    106     }
    107 
    108     if (buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
    109         p->flag |= HAS_EXTRADATA;
    110     } else {
    111         LOGW("No extra data found.");
    112     }
    113     return ret;
    114 }
    115 
    116 OMX_ERRORTYPE OMXVideoDecoderPAVC::BuildHandlerList(void) {
    117     OMXVideoDecoderBase::BuildHandlerList();
    118     AddHandler(OMX_IndexParamVideoAvc, GetParamVideoAvc, SetParamVideoAvc);
    119     AddHandler(OMX_IndexParamVideoProfileLevelQuerySupported, GetVideoProfileLevelQuerySupported, SetVideoProfileLevelQuerySupported);
    120     AddHandler(OMX_IndexParamVideoProfileLevelCurrent, GetVideoProfileLevelCurrent, SetVideoProfileLevelCurrent);
    121     return OMX_ErrorNone;
    122 }
    123 
    124 OMX_ERRORTYPE OMXVideoDecoderPAVC::GetParamVideoAvc(OMX_PTR pStructure) {
    125     OMX_ERRORTYPE ret;
    126     OMX_VIDEO_PARAM_AVCTYPE *p = (OMX_VIDEO_PARAM_AVCTYPE *)pStructure;
    127     CHECK_TYPE_HEADER(p);
    128     CHECK_PORT_INDEX(p, INPORT_INDEX);
    129 
    130     memcpy(p, &mParamAvc, sizeof(*p));
    131     return OMX_ErrorNone;
    132 }
    133 
    134 OMX_ERRORTYPE OMXVideoDecoderPAVC::SetParamVideoAvc(OMX_PTR pStructure) {
    135     OMX_ERRORTYPE ret;
    136     OMX_VIDEO_PARAM_AVCTYPE *p = (OMX_VIDEO_PARAM_AVCTYPE *)pStructure;
    137     CHECK_TYPE_HEADER(p);
    138     CHECK_PORT_INDEX(p, INPORT_INDEX);
    139     CHECK_SET_PARAM_STATE();
    140 
    141     // TODO: do we need to check if port is enabled?
    142     // TODO: see SetPortAvcParam implementation - Can we make simple copy????
    143     memcpy(&mParamAvc, p, sizeof(mParamAvc));
    144     return OMX_ErrorNone;
    145 }
    146 
    147 OMX_ERRORTYPE OMXVideoDecoderPAVC::GetVideoProfileLevelQuerySupported(OMX_PTR pStructure) {
    148     OMX_ERRORTYPE ret;
    149     OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure;
    150 
    151     CHECK_TYPE_HEADER(p);
    152     CHECK_PORT_INDEX_RANGE(p);
    153 
    154     if (p->nProfileIndex != 0) {
    155         LOGE("No more profile index for GetVideoProfileLevelQuerySupported.");
    156         return OMX_ErrorNoMore;
    157     }
    158     p->eProfile = mParamAvc.eProfile;
    159     p->eLevel = mParamAvc.eLevel;
    160 
    161     return OMX_ErrorNone;
    162 }
    163 
    164 OMX_ERRORTYPE OMXVideoDecoderPAVC::SetVideoProfileLevelQuerySupported(OMX_PTR) {
    165     LOGE("SetVideoProfileLevelQuerySupported is not supported.");
    166     return OMX_ErrorUnsupportedSetting;
    167 }
    168 
    169 OMX_ERRORTYPE OMXVideoDecoderPAVC::GetVideoProfileLevelCurrent(OMX_PTR pStructure) {
    170     OMX_ERRORTYPE ret;
    171     OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure;
    172 
    173     CHECK_TYPE_HEADER(p);
    174     CHECK_PORT_INDEX_RANGE(p);
    175 
    176     if (p->nProfileIndex != 0) {
    177         LOGE("No more profile index for GetVideoProfileLevelCurrent.");
    178         return OMX_ErrorNoMore;
    179     }
    180 
    181     p->eProfile = mCurrentProfile;
    182     p->eLevel = mCurrentLevel;
    183 
    184     return OMX_ErrorNone;
    185 }
    186 
    187 OMX_ERRORTYPE OMXVideoDecoderPAVC::SetVideoProfileLevelCurrent(OMX_PTR pStructure) {
    188     OMX_ERRORTYPE ret;
    189     OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure;
    190 
    191     CHECK_TYPE_HEADER(p);
    192     CHECK_PORT_INDEX_RANGE(p);
    193 
    194     if (p->nProfileIndex != 0) {
    195         LOGE("Invalid profile index for SetVideoProfileLevelCurrent.");
    196         return OMX_ErrorBadParameter;
    197     }
    198 
    199     mCurrentProfile = (OMX_VIDEO_AVCPROFILETYPE) p->eProfile;
    200     mCurrentLevel = (OMX_VIDEO_AVCLEVELTYPE) p->eLevel;
    201 
    202     return OMX_ErrorNone;
    203 }
    204 
    205 DECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.PAVC", "video_decoder.pavc", OMXVideoDecoderPAVC);
    206 
    207