diff options
author | Wonsik Kim <wonsik@google.com> | 2020-02-06 23:00:39 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-02-06 23:00:39 +0000 |
commit | 4a77192ee37a995c163ee30e8f24b0658093d59f (patch) | |
tree | c67dd5ea9b836a558b4dd82cd329626ab2e35fbb /media/jni/android_media_MediaCodec.cpp | |
parent | 8db4c7bd521269c2f0457239eb4893d3806cc241 (diff) | |
parent | 7954ccd53998c837fd964fc605967a6c609d69ea (diff) |
Merge "MediaCodec: use setInternalStateLocked to set Linear/GraphicBlock contexts"
Diffstat (limited to 'media/jni/android_media_MediaCodec.cpp')
-rw-r--r-- | media/jni/android_media_MediaCodec.cpp | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 9b37f955fa17..71ba59c8a707 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -724,18 +724,21 @@ status_t JMediaCodec::getOutputFrame( } if (buffer->size() > 0) { - // asC2Buffer clears internal reference, so set the reference again. std::shared_ptr<C2Buffer> c2Buffer = buffer->asC2Buffer(); - buffer->copy(c2Buffer); if (c2Buffer) { + // asC2Buffer clears internal reference, so set the reference again. + buffer->copy(c2Buffer); switch (c2Buffer->data().type()) { case C2BufferData::LINEAR: { std::unique_ptr<JMediaCodecLinearBlock> context{new JMediaCodecLinearBlock}; context->mBuffer = c2Buffer; ScopedLocalRef<jobject> linearBlock{env, env->NewObject( gLinearBlockInfo.clazz, gLinearBlockInfo.ctorId)}; - env->SetLongField( - linearBlock.get(), gLinearBlockInfo.contextId, (jlong)context.release()); + env->CallVoidMethod( + linearBlock.get(), + gLinearBlockInfo.setInternalStateId, + (jlong)context.release(), + true); env->SetObjectField(frame, gFields.outputFrameLinearBlockID, linearBlock.get()); break; } @@ -744,8 +747,11 @@ status_t JMediaCodec::getOutputFrame( context->mBuffer = c2Buffer; ScopedLocalRef<jobject> graphicBlock{env, env->NewObject( gGraphicBlockInfo.clazz, gGraphicBlockInfo.ctorId)}; - env->SetLongField( - graphicBlock.get(), gGraphicBlockInfo.contextId, (jlong)context.release()); + env->CallVoidMethod( + graphicBlock.get(), + gGraphicBlockInfo.setInternalStateId, + (jlong)context.release(), + true); env->SetObjectField(frame, gFields.outputFrameGraphicBlockID, graphicBlock.get()); break; } @@ -761,16 +767,22 @@ status_t JMediaCodec::getOutputFrame( context->mLegacyBuffer = buffer; ScopedLocalRef<jobject> linearBlock{env, env->NewObject( gLinearBlockInfo.clazz, gLinearBlockInfo.ctorId)}; - env->SetLongField( - linearBlock.get(), gLinearBlockInfo.contextId, (jlong)context.release()); + env->CallVoidMethod( + linearBlock.get(), + gLinearBlockInfo.setInternalStateId, + (jlong)context.release(), + true); env->SetObjectField(frame, gFields.outputFrameLinearBlockID, linearBlock.get()); } else { std::unique_ptr<JMediaCodecGraphicBlock> context{new JMediaCodecGraphicBlock}; context->mLegacyBuffer = buffer; ScopedLocalRef<jobject> graphicBlock{env, env->NewObject( gGraphicBlockInfo.clazz, gGraphicBlockInfo.ctorId)}; - env->SetLongField( - graphicBlock.get(), gGraphicBlockInfo.contextId, (jlong)context.release()); + env->CallVoidMethod( + graphicBlock.get(), + gGraphicBlockInfo.setInternalStateId, + (jlong)context.release(), + true); env->SetObjectField(frame, gFields.outputFrameGraphicBlockID, graphicBlock.get()); } } |