1a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org/* 2a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * 4a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org */ 10a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 11a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/examples/android/media_demo/jni/media_codec_video_decoder.h" 12a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 13a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include <android/log.h> 14a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 15a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/examples/android/media_demo/jni/jni_helpers.h" 16a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include "webrtc/modules/utility/interface/helpers_android.h" 17a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 18a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgnamespace webrtc { 19a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 20a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgMediaCodecVideoDecoder::MediaCodecVideoDecoder(JavaVM* vm, jobject decoder) 21a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org : vm_(vm), decoder_(NULL), j_start_(NULL), j_push_buffer_(NULL) { 22a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org AttachThreadScoped ats(vm_); 23a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org JNIEnv* jni = ats.env(); 24a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org // Make sure that the decoder is not recycled. 25a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org decoder_ = jni->NewGlobalRef(decoder); 26a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 27a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org // Get all function IDs. 28a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jclass decoderClass = jni->GetObjectClass(decoder); 29a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org j_push_buffer_ = 30a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jni->GetMethodID(decoderClass, "pushBuffer", "(Ljava/nio/ByteBuffer;J)V"); 31a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org j_start_ = jni->GetMethodID(decoderClass, "start", "(II)Z"); 32a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org} 33a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 34a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgMediaCodecVideoDecoder::~MediaCodecVideoDecoder() { 35a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org AttachThreadScoped ats(vm_); 36a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org JNIEnv* jni = ats.env(); 37a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jni->DeleteGlobalRef(decoder_); 38a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org} 39a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 40a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgint32_t MediaCodecVideoDecoder::InitDecode(const VideoCodec* codecSettings, 41a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org int32_t numberOfCores) { 42a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org AttachThreadScoped ats(vm_); 43a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org JNIEnv* jni = ats.env(); 44a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org if (!jni->CallBooleanMethod(decoder_, j_start_, codecSettings->width, 45a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org codecSettings->height)) { 46a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org return WEBRTC_VIDEO_CODEC_ERROR; 47a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org } 48a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 49a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org} 50a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 51a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgint32_t MediaCodecVideoDecoder::Decode( 52a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org const EncodedImage& inputImage, bool missingFrames, 53a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org const RTPFragmentationHeader* fragmentation, 54a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org const CodecSpecificInfo* codecSpecificInfo, int64_t renderTimeMs) { 55a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 56a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org AttachThreadScoped ats(vm_); 57a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org JNIEnv* jni = ats.env(); 58a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jobject byteBuffer = 59a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jni->NewDirectByteBuffer(inputImage._buffer, inputImage._length); 60a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jni->CallVoidMethod(decoder_, j_push_buffer_, byteBuffer, renderTimeMs); 61a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jni->DeleteLocalRef(byteBuffer); 62a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org return WEBRTC_VIDEO_CODEC_NO_OUTPUT; 63a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org} 64a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 65a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgint32_t MediaCodecVideoDecoder::RegisterDecodeCompleteCallback( 66a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org DecodedImageCallback* callback) { 67a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 68a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org} 69a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 70a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgint32_t MediaCodecVideoDecoder::Release() { 71a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org // TODO(hellner): this maps nicely to MediaCodecVideoDecoder::dispose(). 72a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 73a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org} 74a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 75a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgint32_t MediaCodecVideoDecoder::Reset() { 76a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org // TODO(hellner): implement. MediaCodec::stop() followed by 77a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org // MediaCodec::start()? 78a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 79a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org} 80a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 81a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org} // namespace webrtc 82