// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_BASE_ANDROID_WEBAUDIO_MEDIA_CODEC_BRIDGE_H_ #define MEDIA_BASE_ANDROID_WEBAUDIO_MEDIA_CODEC_BRIDGE_H_ #include <jni.h> #include "base/file_descriptor_posix.h" #include "base/memory/shared_memory.h" #include "media/base/media_export.h" namespace media { // This class serves as a bridge for native code to call Java // functions in the Android MediaCodec class. See // http://developer.android.com/reference/android/media/MediaCodec.html. class MEDIA_EXPORT WebAudioMediaCodecBridge { public: // Create the bridge with the given file descriptors. We read from // |encoded_audio_handle| to get the encoded audio data. Audio file // information and decoded PCM samples are written to |pcm_output|. // We also take ownership of |pcm_output|. WebAudioMediaCodecBridge(base::SharedMemoryHandle encoded_audio_handle, base::FileDescriptor pcm_output, uint32_t data_size); ~WebAudioMediaCodecBridge(); // Inform JNI about this bridge. Returns true if registration // succeeded. static bool RegisterWebAudioMediaCodecBridge(JNIEnv* env); // Start MediaCodec to process the encoded data in // |encoded_audio_handle|. The PCM samples are sent to |pcm_output|. static void RunWebAudioMediaCodec( base::SharedMemoryHandle encoded_audio_handle, base::FileDescriptor pcm_output, uint32_t data_size); void OnChunkDecoded(JNIEnv* env, jobject /*java object*/, jobject buf, jint buf_size, jint input_channel_count, jint output_channel_count); void InitializeDestination(JNIEnv* env, jobject /*java object*/, jint channel_count, jint sample_rate, jlong duration_us); private: // Handles MediaCodec processing of the encoded data in // |encoded_audio_handle_| and sends the pcm data to |pcm_output_|. // Returns true if decoding was successful. bool DecodeInMemoryAudioFile(); // Save encoded audio data to a temporary file and return the file // descriptor to that file. -1 is returned if the audio data could // not be saved for any reason. int SaveEncodedAudioToFile(JNIEnv*, jobject); // The encoded audio data is read from this file descriptor for the // shared memory that holds the encoded data. base::SharedMemoryHandle encoded_audio_handle_; // The audio file information and decoded pcm data are written to // this file descriptor. We take ownership of this descriptor. int pcm_output_; // The length of the encoded data. uint32_t data_size_; DISALLOW_COPY_AND_ASSIGN(WebAudioMediaCodecBridge); }; } // namespace media #endif // MEDIA_BASE_ANDROID_WEBAUDIO_MEDIA_CODEC_BRIDGE_H_