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