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