summaryrefslogtreecommitdiff
path: root/media/jni/android_media_MediaCodec.cpp
diff options
context:
space:
mode:
authorWonsik Kim <wonsik@google.com>2020-01-29 22:23:52 -0800
committerWonsik Kim <wonsik@google.com>2020-01-29 22:23:52 -0800
commit7954ccd53998c837fd964fc605967a6c609d69ea (patch)
tree90c417a651e21af1ff3eb1abb7bf5ce9470b2c68 /media/jni/android_media_MediaCodec.cpp
parent12ce8338cc178e7683386c026709a74f2733abb7 (diff)
MediaCodec: use setInternalStateLocked to set Linear/GraphicBlock contexts
Bug: 148410627 Test: atest CtsMediaTestCases:MediaCodecBlockModelTest Change-Id: I8d18c30b2036d0da41d0fad943498aa2ad139c45
Diffstat (limited to 'media/jni/android_media_MediaCodec.cpp')
-rw-r--r--media/jni/android_media_MediaCodec.cpp32
1 files changed, 22 insertions, 10 deletions
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index ab6966d5d1c3..9ff7e6ceae95 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());
}
}