|
|
|
@ -502,7 +502,7 @@ void C2SoftAvcDec::getVersion() {
|
|
|
|
|
status_t C2SoftAvcDec::initDecoder() {
|
|
|
|
|
if (OK != createDecoder()) return UNKNOWN_ERROR;
|
|
|
|
|
mNumCores = MIN(getCpuCoreCount(), MAX_NUM_CORES);
|
|
|
|
|
mStride = ALIGN128(mWidth);
|
|
|
|
|
mStride = ALIGN32(mWidth);
|
|
|
|
|
mSignalledError = false;
|
|
|
|
|
resetPlugin();
|
|
|
|
|
(void) setNumCores();
|
|
|
|
@ -520,10 +520,20 @@ bool C2SoftAvcDec::setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
|
|
|
|
|
size_t inSize,
|
|
|
|
|
uint32_t tsMarker) {
|
|
|
|
|
uint32_t displayStride = mStride;
|
|
|
|
|
if (outBuffer) {
|
|
|
|
|
C2PlanarLayout layout;
|
|
|
|
|
layout = outBuffer->layout();
|
|
|
|
|
displayStride = layout.planes[C2PlanarLayout::PLANE_Y].rowInc;
|
|
|
|
|
}
|
|
|
|
|
uint32_t displayHeight = mHeight;
|
|
|
|
|
size_t lumaSize = displayStride * displayHeight;
|
|
|
|
|
size_t chromaSize = lumaSize >> 2;
|
|
|
|
|
|
|
|
|
|
if (mStride != displayStride) {
|
|
|
|
|
mStride = displayStride;
|
|
|
|
|
if (OK != setParams(mStride, IVD_DECODE_FRAME)) return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ps_decode_ip->u4_size = sizeof(ivd_video_decode_ip_t);
|
|
|
|
|
ps_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
|
|
|
|
|
if (inBuffer) {
|
|
|
|
@ -757,24 +767,21 @@ c2_status_t C2SoftAvcDec::ensureDecoderState(const std::shared_ptr<C2BlockPool>
|
|
|
|
|
ALOGE("not supposed to be here, invalid decoder context");
|
|
|
|
|
return C2_CORRUPTED;
|
|
|
|
|
}
|
|
|
|
|
if (mStride != ALIGN128(mWidth)) {
|
|
|
|
|
mStride = ALIGN128(mWidth);
|
|
|
|
|
if (OK != setParams(mStride, IVD_DECODE_FRAME)) return C2_CORRUPTED;
|
|
|
|
|
}
|
|
|
|
|
if (mOutBlock &&
|
|
|
|
|
(mOutBlock->width() != mStride || mOutBlock->height() != mHeight)) {
|
|
|
|
|
(mOutBlock->width() != ALIGN32(mWidth) || mOutBlock->height() != mHeight)) {
|
|
|
|
|
mOutBlock.reset();
|
|
|
|
|
}
|
|
|
|
|
if (!mOutBlock) {
|
|
|
|
|
uint32_t format = HAL_PIXEL_FORMAT_YV12;
|
|
|
|
|
C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
|
|
|
|
|
c2_status_t err = pool->fetchGraphicBlock(mStride, mHeight, format, usage, &mOutBlock);
|
|
|
|
|
c2_status_t err =
|
|
|
|
|
pool->fetchGraphicBlock(ALIGN32(mWidth), mHeight, format, usage, &mOutBlock);
|
|
|
|
|
if (err != C2_OK) {
|
|
|
|
|
ALOGE("fetchGraphicBlock for Output failed with status %d", err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
ALOGV("provided (%dx%d) required (%dx%d)",
|
|
|
|
|
mOutBlock->width(), mOutBlock->height(), mStride, mHeight);
|
|
|
|
|
mOutBlock->width(), mOutBlock->height(), ALIGN32(mWidth), mHeight);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return C2_OK;
|
|
|
|
@ -909,7 +916,8 @@ void C2SoftAvcDec::process(
|
|
|
|
|
if (0 < s_decode_op.u4_pic_wd && 0 < s_decode_op.u4_pic_ht) {
|
|
|
|
|
if (mHeaderDecoded == false) {
|
|
|
|
|
mHeaderDecoded = true;
|
|
|
|
|
setParams(ALIGN128(s_decode_op.u4_pic_wd), IVD_DECODE_FRAME);
|
|
|
|
|
mStride = ALIGN32(s_decode_op.u4_pic_wd);
|
|
|
|
|
setParams(mStride, IVD_DECODE_FRAME);
|
|
|
|
|
}
|
|
|
|
|
if (s_decode_op.u4_pic_wd != mWidth || s_decode_op.u4_pic_ht != mHeight) {
|
|
|
|
|
mWidth = s_decode_op.u4_pic_wd;
|
|
|
|
|