Decode_Status VaapiDecoderVP8::decode(VideoDecodeBuffer * buffer) { Decode_Status status; Vp8ParseResult result; bool isEOS = false; m_currentPTS = buffer->timeStamp; m_buffer = buffer->data; m_frameSize = buffer->size; DEBUG("VP8: Decode(bufsize =%d, timestamp=%ld)", m_frameSize, m_currentPTS); do { if (m_frameSize == 0) { status = DECODE_FAIL; break; } memset(&m_frameHdr, 0, sizeof(m_frameHdr)); m_frameHdr.multi_frame_data = &m_currFrameContext; result = vp8_parse_frame_header(&m_frameHdr, m_buffer, 0, m_frameSize); status = getStatus(result); if (status != DECODE_SUCCESS) { break; } if (m_frameHdr.key_frame == VP8_KEY_FRAME) { status = ensureContext(); if (status != DECODE_SUCCESS) return status; } status = decodePicture(); if (status != DECODE_SUCCESS) break; if (m_frameHdr.show_frame) { m_currentPicture->m_timeStamp = m_currentPTS; m_currentPicture->output(); } else { WARNING("warning: this picture isn't sent to render"); } updateReferencePictures(); if (m_frameHdr.refresh_entropy_probs) { memcpy(&m_lastFrameContext.token_prob_update, &m_currFrameContext.token_prob_update, sizeof(Vp8TokenProbUpdate)); memcpy(&m_lastFrameContext.mv_prob_update, &m_currFrameContext.mv_prob_update, sizeof(Vp8MvProbUpdate)); if (m_frameHdr.intra_16x16_prob_update_flag) memcpy(m_yModeProbs, m_frameHdr.intra_16x16_prob, 4); if (m_frameHdr.intra_chroma_prob_update_flag) memcpy(m_uvModeProbs, m_frameHdr.intra_chroma_prob, 3); } else { memcpy(&m_currFrameContext.token_prob_update, &m_lastFrameContext.token_prob_update, sizeof(Vp8TokenProbUpdate)); memcpy(&m_currFrameContext.mv_prob_update, &m_lastFrameContext.mv_prob_update, sizeof(Vp8MvProbUpdate)); } } while (0); if (status != DECODE_SUCCESS) { DEBUG("decode fail!!"); } return status; }
Decode_Status VaapiDecoderVP8::decode(VideoDecodeBuffer * buffer) { Decode_Status status; Vp8ParserResult result; m_currentPTS = buffer->timeStamp; m_buffer = buffer->data; m_frameSize = buffer->size; DEBUG("VP8: Decode(bufsize =%d, timestamp=%ld)", m_frameSize, m_currentPTS); do { if (m_frameSize == 0) { status = DECODE_FAIL; break; } memset(&m_frameHdr, 0, sizeof(m_frameHdr)); result = vp8_parser_parse_frame_header(&m_parser, &m_frameHdr, m_buffer, m_frameSize); status = getStatus(result); if (status != DECODE_SUCCESS) { break; } if (m_frameHdr.key_frame) { status = ensureContext(); if (status != DECODE_SUCCESS) return status; } #if __PSB_CACHE_DRAIN_FOR_FIRST_FRAME__ int ii = 0; int decodeCount = 1; if (m_isFirstFrame) { decodeCount = 1280 * 720 / m_frameWidth / m_frameHeight * 2; m_isFirstFrame = false; } do { status = decodePicture(); } while (status == DECODE_SUCCESS && ++ii < decodeCount); #else status = decodePicture(); #endif if (status != DECODE_SUCCESS) break; if (m_frameHdr.show_frame) { m_currentPicture->m_timeStamp = m_currentPTS; //FIXME: add output outputPicture(m_currentPicture); } else { WARNING("warning: this picture isn't sent to render"); } updateReferencePictures(); } while (0); if (status != DECODE_SUCCESS) { DEBUG("decode fail!!"); } return status; }