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 "VideoDecoderVP8.h"
1882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoDecoderTrace.h"
1982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <string.h>
2082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
2182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVideoDecoderVP8::VideoDecoderVP8(const char *mimeType)
2282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    : VideoDecoderBase(mimeType, VBP_VP8) {
2382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    invalidateReferenceFrames(0);
2482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    invalidateReferenceFrames(1);
2582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
2682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
2782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVideoDecoderVP8::~VideoDecoderVP8() {
2882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    stop();
2982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
3082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
3182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid VideoDecoderVP8::invalidateReferenceFrames(int toggle) {
3282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    ReferenceFrameBuffer *p = mRFBs[toggle];
3382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    for (int i = 0; i < VP8_REF_SIZE; i++) {
3482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        p->index = (uint32_t) -1;
3582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        p->surfaceBuffer = NULL;
3682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        p++;
3782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
3882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
3982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
4082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid VideoDecoderVP8::clearAsReference(int toggle, int ref_type) {
4182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    ReferenceFrameBuffer ref = mRFBs[toggle][ref_type];
4282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (ref.surfaceBuffer) {
4382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        ref.surfaceBuffer->asReferernce = false;
4482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
4582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
4682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
4782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid VideoDecoderVP8::updateFormatInfo(vbp_data_vp8 *data) {
4882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t width = data->codec_data->frame_width;
4982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t height = data->codec_data->frame_height;
5082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    ITRACE("updateFormatInfo: current size: %d x %d, new size: %d x %d",
5182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mVideoFormatInfo.width, mVideoFormatInfo.height, width, height);
5282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
531175ce579a69e847027026f615a053af76b792d5Tianmi Chen    if ((mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER) && mStoreMetaData) {
541175ce579a69e847027026f615a053af76b792d5Tianmi Chen        pthread_mutex_lock(&mFormatLock);
551175ce579a69e847027026f615a053af76b792d5Tianmi Chen    }
561175ce579a69e847027026f615a053af76b792d5Tianmi Chen
5782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if ((mVideoFormatInfo.width != width ||
5882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mVideoFormatInfo.height != height) &&
5982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            width && height) {
6082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        if ((VideoDecoderBase::alignMB(mVideoFormatInfo.width) != width) ||
6182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            (VideoDecoderBase::alignMB(mVideoFormatInfo.height) != height)) {
6282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mSizeChanged = true;
6382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            ITRACE("Video size is changed.");
6482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        }
6582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mVideoFormatInfo.width = width;
6682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mVideoFormatInfo.height = height;
6782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
6882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
699892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding    // video_range has default value of 0. Y ranges from 16 to 235.
709892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding    mVideoFormatInfo.videoRange = 0;
719892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding
729892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding    switch (data->codec_data->clr_type) {
739892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding        case 0:
749892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding            mVideoFormatInfo.colorMatrix = VA_SRC_BT601;
759892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding            break;
769892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding        case 1:
779892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding        default:
789892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding            mVideoFormatInfo.colorMatrix = 0;
799892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding            break;
809892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding    }
819892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding
8282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mVideoFormatInfo.cropLeft = data->codec_data->crop_left;
8382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mVideoFormatInfo.cropRight = data->codec_data->crop_right;
8482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mVideoFormatInfo.cropTop = data->codec_data->crop_top;
8582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mVideoFormatInfo.cropBottom = data->codec_data->crop_bottom;
8682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    ITRACE("Cropping: left = %d, top = %d, right = %d, bottom = %d", data->codec_data->crop_left, data->codec_data->crop_top, data->codec_data->crop_right, data->codec_data->crop_bottom);
8782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
881175ce579a69e847027026f615a053af76b792d5Tianmi Chen    if ((mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER) && mStoreMetaData) {
891175ce579a69e847027026f615a053af76b792d5Tianmi Chen        if (mSizeChanged) {
901175ce579a69e847027026f615a053af76b792d5Tianmi Chen            mVideoFormatInfo.valid = false;
911175ce579a69e847027026f615a053af76b792d5Tianmi Chen        } else {
921175ce579a69e847027026f615a053af76b792d5Tianmi Chen            mVideoFormatInfo.valid = true;
931175ce579a69e847027026f615a053af76b792d5Tianmi Chen        }
941175ce579a69e847027026f615a053af76b792d5Tianmi Chen
951175ce579a69e847027026f615a053af76b792d5Tianmi Chen        pthread_mutex_unlock(&mFormatLock);
961175ce579a69e847027026f615a053af76b792d5Tianmi Chen    } else {
971175ce579a69e847027026f615a053af76b792d5Tianmi Chen        mVideoFormatInfo.valid = true;
981175ce579a69e847027026f615a053af76b792d5Tianmi Chen    }
9982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
10082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    setRenderRect();
1019892b9c8b325cc6fc1e3fb98455b3701e89c8885Haitao Ding    setColorSpaceInfo(mVideoFormatInfo.colorMatrix, mVideoFormatInfo.videoRange);
10282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
10382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
10482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONDecode_Status VideoDecoderVP8::startVA(vbp_data_vp8 *data) {
10582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    updateFormatInfo(data);
10682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
10782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VAProfile vaProfile = VAProfileVP8Version0_3;
10882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (data->codec_data->version_num > 3) {
10982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        return DECODE_PARSER_FAIL;
11082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
11182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
11282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    enableLowDelayMode(true);
11382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
11482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    return VideoDecoderBase::setupVA(VP8_SURFACE_NUMBER + VP8_REF_SIZE, vaProfile);
11582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
11682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
11782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONDecode_Status VideoDecoderVP8::start(VideoConfigBuffer *buffer) {
11882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Decode_Status status;
11982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
12082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    status = VideoDecoderBase::start(buffer);
12182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_STATUS("VideoDecoderBase::start");
12282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
12382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    // We don't want base class to manage reference.
12482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VideoDecoderBase::ManageReference(false);
12582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
12682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (buffer->data == NULL || buffer->size == 0) {
12782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        WTRACE("No config data to start VA.");
12882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        return DECODE_SUCCESS;
12982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
13082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
13182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vbp_data_vp8 *data = NULL;
13282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    status = VideoDecoderBase::parseBuffer(buffer->data, buffer->size, true, (void**)&data);
13382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_STATUS("VideoDecoderBase::parseBuffer");
13482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
13582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    status = startVA(data);
13682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    return status;
13782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
13882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
13982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid VideoDecoderVP8::stop(void) {
14082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VideoDecoderBase::stop();
14182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
14282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    invalidateReferenceFrames(0);
14382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    invalidateReferenceFrames(1);
14482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
14582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
14682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid VideoDecoderVP8::flush(void) {
14782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VideoDecoderBase::flush();
14882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
14982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    invalidateReferenceFrames(0);
15082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    invalidateReferenceFrames(1);
15182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
15282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
15382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONDecode_Status VideoDecoderVP8::decode(VideoDecodeBuffer *buffer) {
15482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Decode_Status status;
15582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vbp_data_vp8 *data = NULL;
15682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (buffer == NULL) {
15782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        ETRACE("VideoDecodeBuffer is NULL.");
15882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        return DECODE_INVALID_DATA;
15982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
16082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
16182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    status = VideoDecoderBase::parseBuffer(
16282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                 buffer->data,
16382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                 buffer->size,
16482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                 false,
16582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                 (void**)&data);
16682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_STATUS("VideoDecoderBase::parseBuffer");
16782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
16882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mShowFrame = data->codec_data->show_frame;
16982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
17082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (!mVAStarted) {
17182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        status = startVA(data);
17282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        CHECK_STATUS("startVA");
17382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
17482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
17582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VideoDecoderBase::setRotationDegrees(buffer->rotationDegrees);
17682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
17782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    status = decodeFrame(buffer, data);
17882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
17982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    return status;
18082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
18182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
18282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONDecode_Status VideoDecoderVP8::decodeFrame(VideoDecodeBuffer* buffer, vbp_data_vp8 *data) {
18382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Decode_Status status;
18482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool useGraphicbuffer = mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER;
18582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mCurrentPTS = buffer->timeStamp;
18682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (0 == data->num_pictures || NULL == data->pic_data) {
18782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        WTRACE("Number of pictures is 0.");
18882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        return DECODE_SUCCESS;
18982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
19082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
19182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (VP8_KEY_FRAME == data->codec_data->frame_type) {
1921175ce579a69e847027026f615a053af76b792d5Tianmi Chen        updateFormatInfo(data);
1931175ce579a69e847027026f615a053af76b792d5Tianmi Chen        if (mSizeChanged && !(mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER)) {
19482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mSizeChanged = false;
19582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            return DECODE_FORMAT_CHANGE;
1961175ce579a69e847027026f615a053af76b792d5Tianmi Chen        }
1971175ce579a69e847027026f615a053af76b792d5Tianmi Chen
1981175ce579a69e847027026f615a053af76b792d5Tianmi Chen        bool needFlush = false;
1991175ce579a69e847027026f615a053af76b792d5Tianmi Chen        if (useGraphicbuffer) {
2001175ce579a69e847027026f615a053af76b792d5Tianmi Chen            // For VP8 in adaptive playback legacy mode,
2011175ce579a69e847027026f615a053af76b792d5Tianmi Chen            // force buffer reallocation.
2021175ce579a69e847027026f615a053af76b792d5Tianmi Chen            needFlush = mSizeChanged;
2031175ce579a69e847027026f615a053af76b792d5Tianmi Chen        }
2041175ce579a69e847027026f615a053af76b792d5Tianmi Chen        if (needFlush) {
2051175ce579a69e847027026f615a053af76b792d5Tianmi Chen            if (mStoreMetaData) {
2061175ce579a69e847027026f615a053af76b792d5Tianmi Chen                status = endDecodingFrame(false);
2071175ce579a69e847027026f615a053af76b792d5Tianmi Chen                CHECK_STATUS("endDecodingFrame");
2081175ce579a69e847027026f615a053af76b792d5Tianmi Chen            } else {
20982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                flushSurfaceBuffers();
21082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            }
2111175ce579a69e847027026f615a053af76b792d5Tianmi Chen            mSizeChanged = false;
2121175ce579a69e847027026f615a053af76b792d5Tianmi Chen            return DECODE_FORMAT_CHANGE;
21382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        }
21482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
21582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
21682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (data->codec_data->frame_type == VP8_SKIPPED_FRAME) {
21782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        // Do nothing for skip frame as the last frame will be rendered agian by natively
21882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        return DECODE_SUCCESS;
21982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
22082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
22182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    status = acquireSurfaceBuffer();
22282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_STATUS("acquireSurfaceBuffer");
22382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
22482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    // set referenceFrame to true if frame decoded is I/P frame, false otherwise.
22582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    int frameType = data->codec_data->frame_type;
22682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mAcquiredBuffer->referenceFrame = (frameType == VP8_KEY_FRAME || frameType == VP8_INTER_FRAME);
22782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    // assume it is frame picture.
22882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mAcquiredBuffer->renderBuffer.scanFormat = VA_FRAME_PICTURE;
22982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mAcquiredBuffer->renderBuffer.timeStamp = buffer->timeStamp;
23082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mAcquiredBuffer->renderBuffer.flag = 0;
23182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (buffer->flag & WANT_DECODE_ONLY) {
23282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mAcquiredBuffer->renderBuffer.flag |= WANT_DECODE_ONLY;
23382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
23482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (mSizeChanged) {
23582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mSizeChanged = false;
23682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mAcquiredBuffer->renderBuffer.flag |= IS_RESOLUTION_CHANGE;
23782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
23882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
23982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    // Here data->num_pictures is always equal to 1
24082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    for (uint32_t index = 0; index < data->num_pictures; index++) {
24182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        status = decodePicture(data, index);
24282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        if (status != DECODE_SUCCESS) {
24382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            endDecodingFrame(true);
24482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            return status;
24582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        }
24682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
24782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
24882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (frameType != VP8_SKIPPED_FRAME) {
24982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        updateReferenceFrames(data);
25082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
25182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
25282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    // if sample is successfully decoded, call outputSurfaceBuffer(); otherwise
25382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    // call releaseSurfacebuffer();
25482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    status = outputSurfaceBuffer();
25582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    return status;
25682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
25782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
25882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONDecode_Status VideoDecoderVP8::decodePicture(vbp_data_vp8 *data, int32_t picIndex) {
25982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VAStatus vaStatus = VA_STATUS_SUCCESS;
26082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Decode_Status status;
26182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t bufferIDCount = 0;
26282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VABufferID bufferIDs[5];
26382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
26482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vbp_picture_data_vp8 *picData = &(data->pic_data[picIndex]);
26582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VAPictureParameterBufferVP8 *picParams = picData->pic_parms;
26682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
26782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    status = setReference(picParams);
26882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_STATUS("setReference");
26982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
27082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vaStatus = vaBeginPicture(mVADisplay, mVAContext, mAcquiredBuffer->renderBuffer.surface);
27182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_VA_STATUS("vaBeginPicture");
27282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    // setting mDecodingFrame to true so vaEndPicture will be invoked to end the picture decoding.
27382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mDecodingFrame = true;
27482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
27582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vaStatus = vaCreateBuffer(
27682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   mVADisplay,
27782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   mVAContext,
27882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   VAPictureParameterBufferType,
27982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   sizeof(VAPictureParameterBufferVP8),
28082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   1,
28182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   picParams,
28282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   &bufferIDs[bufferIDCount]);
28382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_VA_STATUS("vaCreatePictureParameterBuffer");
28482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bufferIDCount++;
28582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
28682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vaStatus = vaCreateBuffer(
28782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   mVADisplay,
28882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   mVAContext,
28982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   VAProbabilityBufferType,
29082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   sizeof(VAProbabilityDataBufferVP8),
29182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   1,
29282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   data->prob_data,
29382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   &bufferIDs[bufferIDCount]);
29482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_VA_STATUS("vaCreateProbabilityBuffer");
29582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bufferIDCount++;
29682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
29782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vaStatus = vaCreateBuffer(
29882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   mVADisplay,
29982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   mVAContext,
30082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   VAIQMatrixBufferType,
30182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   sizeof(VAIQMatrixBufferVP8),
30282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   1,
30382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   data->IQ_matrix_buf,
30482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   &bufferIDs[bufferIDCount]);
30582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_VA_STATUS("vaCreateIQMatrixBuffer");
30682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bufferIDCount++;
30782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
30882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* Here picData->num_slices is always equal to 1 */
30982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    for (uint32_t i = 0; i < picData->num_slices; i++) {
31082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        vaStatus = vaCreateBuffer(
31182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       mVADisplay,
31282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       mVAContext,
31382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       VASliceParameterBufferType,
31482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       sizeof(VASliceParameterBufferVP8),
31582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       1,
31682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       &(picData->slc_data[i].slc_parms),
31782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       &bufferIDs[bufferIDCount]);
31882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        CHECK_VA_STATUS("vaCreateSliceParameterBuffer");
31982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        bufferIDCount++;
32082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
32182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        vaStatus = vaCreateBuffer(
32282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       mVADisplay,
32382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       mVAContext,
32482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       VASliceDataBufferType,
32582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       picData->slc_data[i].slice_size, //size
32682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       1,        //num_elements
32782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       picData->slc_data[i].buffer_addr + picData->slc_data[i].slice_offset,
32882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                       &bufferIDs[bufferIDCount]);
32982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        CHECK_VA_STATUS("vaCreateSliceDataBuffer");
33082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        bufferIDCount++;
33182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
33282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
33382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vaStatus = vaRenderPicture(
33482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   mVADisplay,
33582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   mVAContext,
33682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   bufferIDs,
33782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                   bufferIDCount);
33882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_VA_STATUS("vaRenderPicture");
33982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
34082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vaStatus = vaEndPicture(mVADisplay, mVAContext);
34182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mDecodingFrame = false;
34282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_VA_STATUS("vaEndPicture");
34382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
34482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    return DECODE_SUCCESS;
34582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
34682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
34782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONDecode_Status VideoDecoderVP8::setReference(VAPictureParameterBufferVP8 *picParam) {
34882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    int frameType = picParam->pic_fields.bits.key_frame;
34982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    switch (frameType) {
35082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    case VP8_KEY_FRAME:
35182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        picParam->last_ref_frame = VA_INVALID_SURFACE;
35282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        picParam->alt_ref_frame = VA_INVALID_SURFACE;
35382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        picParam->golden_ref_frame = VA_INVALID_SURFACE;
35482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        break;
35582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    case VP8_INTER_FRAME:
35682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        if (mRFBs[0][VP8_LAST_REF_PIC].surfaceBuffer   == NULL ||
35782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                mRFBs[0][VP8_ALT_REF_PIC].surfaceBuffer    == NULL ||
35882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                mRFBs[0][VP8_GOLDEN_REF_PIC].surfaceBuffer == NULL) {
35982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mAcquiredBuffer->renderBuffer.errBuf.errorNumber = 1;
36082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mAcquiredBuffer->renderBuffer.errBuf.errorArray[0].type = DecodeRefMissing;
36182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            return DECODE_NO_REFERENCE;
36282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        }
36382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        //mRFBs[0][VP8_LAST_REF_PIC].surfaceBuffer = mLastReference;
36482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        picParam->last_ref_frame = mRFBs[0][VP8_LAST_REF_PIC].surfaceBuffer->renderBuffer.surface;
36582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        picParam->alt_ref_frame = mRFBs[0][VP8_ALT_REF_PIC].surfaceBuffer->renderBuffer.surface;
36682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        picParam->golden_ref_frame = mRFBs[0][VP8_GOLDEN_REF_PIC].surfaceBuffer->renderBuffer.surface;
36782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        break;
36882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    case VP8_SKIPPED_FRAME:
36982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        // will never happen here
37082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        break;
37182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    default:
37282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        return DECODE_PARSER_FAIL;
37382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
37482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
37582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    return DECODE_SUCCESS;
37682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
37782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
37882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid VideoDecoderVP8::updateReferenceFrames(vbp_data_vp8 *data) {
37982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* Refresh last frame reference buffer using the currently reconstructed frame */
38082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    refreshLastReference(data);
38182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
38282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* Refresh golden frame reference buffer using the currently reconstructed frame */
38382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    refreshGoldenReference(data);
38482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
38582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* Refresh alternative frame reference buffer using the currently reconstructed frame */
38682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    refreshAltReference(data);
38782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
38882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* Update reference frames */
38982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    for (int i = 0; i < VP8_REF_SIZE; i++) {
39082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        VideoSurfaceBuffer *p = mRFBs[1][i].surfaceBuffer;
39182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        int j;
39282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        for (j = 0; j < VP8_REF_SIZE; j++) {
39382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            if (p == mRFBs[0][j].surfaceBuffer) {
39482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                break;
39582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            }
39682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        }
39782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        if (j == VP8_REF_SIZE) {
39882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            clearAsReference(1, i);
39982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        }
40082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
40182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
40282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
40382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid VideoDecoderVP8::refreshLastReference(vbp_data_vp8 *data) {
40482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* Save previous last reference */
40582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mRFBs[1][VP8_LAST_REF_PIC].surfaceBuffer = mRFBs[0][VP8_LAST_REF_PIC].surfaceBuffer;
40682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mRFBs[1][VP8_LAST_REF_PIC].index = mRFBs[0][VP8_LAST_REF_PIC].index;
40782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
40882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* For key frame, this is always true */
40982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (data->codec_data->refresh_last_frame) {
41082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mRFBs[0][VP8_LAST_REF_PIC].surfaceBuffer = mAcquiredBuffer;
41182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mRFBs[0][VP8_LAST_REF_PIC].index = mAcquiredBuffer->renderBuffer.surface;
41282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mRFBs[0][VP8_LAST_REF_PIC].surfaceBuffer->asReferernce = true;
41382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
41482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
41582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
41682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid VideoDecoderVP8::refreshGoldenReference(vbp_data_vp8 *data) {
41782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* Save previous golden reference */
41882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mRFBs[1][VP8_GOLDEN_REF_PIC].surfaceBuffer = mRFBs[0][VP8_GOLDEN_REF_PIC].surfaceBuffer;
41982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mRFBs[1][VP8_GOLDEN_REF_PIC].index = mRFBs[0][VP8_GOLDEN_REF_PIC].index;
42082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
42182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (data->codec_data->golden_copied != BufferCopied_NoneToGolden) {
42282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        if (data->codec_data->golden_copied == BufferCopied_LastToGolden) {
42382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            /* LastFrame is copied to GoldenFrame */
42482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mRFBs[0][VP8_GOLDEN_REF_PIC].surfaceBuffer = mRFBs[1][VP8_LAST_REF_PIC].surfaceBuffer;
42582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mRFBs[0][VP8_GOLDEN_REF_PIC].index = mRFBs[1][VP8_LAST_REF_PIC].index;
42682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        } else if (data->codec_data->golden_copied == BufferCopied_AltRefToGolden) {
42782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            /* AltRefFrame is copied to GoldenFrame */
42882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mRFBs[0][VP8_GOLDEN_REF_PIC].surfaceBuffer = mRFBs[0][VP8_ALT_REF_PIC].surfaceBuffer;
42982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mRFBs[0][VP8_GOLDEN_REF_PIC].index = mRFBs[0][VP8_ALT_REF_PIC].index;
43082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        }
43182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
43282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
43382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* For key frame, this is always true */
43482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (data->codec_data->refresh_golden_frame) {
43582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mRFBs[0][VP8_GOLDEN_REF_PIC].surfaceBuffer = mAcquiredBuffer;
43682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mRFBs[0][VP8_GOLDEN_REF_PIC].index = mAcquiredBuffer->renderBuffer.surface;
43782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mRFBs[0][VP8_GOLDEN_REF_PIC].surfaceBuffer->asReferernce = true;
43882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
43982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
44082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
44182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid VideoDecoderVP8::refreshAltReference(vbp_data_vp8 *data) {
44282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* Save previous alternative reference */
44382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mRFBs[1][VP8_ALT_REF_PIC].surfaceBuffer = mRFBs[0][VP8_ALT_REF_PIC].surfaceBuffer;
44482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    mRFBs[1][VP8_ALT_REF_PIC].index = mRFBs[0][VP8_ALT_REF_PIC].index;
44582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
44682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (data->codec_data->altref_copied != BufferCopied_NoneToAltRef) {
44782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        if (data->codec_data->altref_copied == BufferCopied_LastToAltRef) {
44882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            /* LastFrame is copied to AltRefFrame */
44982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mRFBs[0][VP8_ALT_REF_PIC].surfaceBuffer = mRFBs[1][VP8_LAST_REF_PIC].surfaceBuffer;
45082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mRFBs[0][VP8_ALT_REF_PIC].index = mRFBs[1][VP8_LAST_REF_PIC].index;
45182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        } else if (data->codec_data->altref_copied == BufferCopied_GoldenToAltRef) {
45282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            /* GoldenFrame is copied to AltRefFrame */
45382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mRFBs[0][VP8_ALT_REF_PIC].surfaceBuffer = mRFBs[1][VP8_GOLDEN_REF_PIC].surfaceBuffer;
45482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            mRFBs[0][VP8_ALT_REF_PIC].index = mRFBs[1][VP8_GOLDEN_REF_PIC].index;
45582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        }
45682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
45782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
45882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /* For key frame, this is always true */
45982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (data->codec_data->refresh_alt_frame) {
46082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mRFBs[0][VP8_ALT_REF_PIC].surfaceBuffer = mAcquiredBuffer;
46182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mRFBs[0][VP8_ALT_REF_PIC].index = mAcquiredBuffer->renderBuffer.surface;
46282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        mRFBs[0][VP8_ALT_REF_PIC].surfaceBuffer->asReferernce = true;
46382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
46482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
46582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
46682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
46782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONDecode_Status VideoDecoderVP8::checkHardwareCapability() {
46882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VAStatus vaStatus;
46982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VAConfigAttrib cfgAttribs[2];
47082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    cfgAttribs[0].type = VAConfigAttribMaxPictureWidth;
47182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    cfgAttribs[1].type = VAConfigAttribMaxPictureHeight;
47282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    vaStatus = vaGetConfigAttributes(mVADisplay, VAProfileVP8Version0_3,
47382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            VAEntrypointVLD, cfgAttribs, 2);
47482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    CHECK_VA_STATUS("vaGetConfigAttributes");
47582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    if (cfgAttribs[0].value * cfgAttribs[1].value < (uint32_t)mVideoFormatInfo.width * (uint32_t)mVideoFormatInfo.height) {
47682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        ETRACE("hardware supports resolution %d * %d smaller than the clip resolution %d * %d",
47782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON                cfgAttribs[0].value, cfgAttribs[1].value, mVideoFormatInfo.width, mVideoFormatInfo.height);
47882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON        return DECODE_DRIVER_FAIL;
47982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    }
48082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
48182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    return DECODE_SUCCESS;
48282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}
48382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
484