webaudio_media_codec_bridge.h revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#ifndef MEDIA_BASE_ANDROID_WEBAUDIO_MEDIA_CODEC_BRIDGE_H_ 6a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#define MEDIA_BASE_ANDROID_WEBAUDIO_MEDIA_CODEC_BRIDGE_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <jni.h> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/file_descriptor_posix.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/shared_memory.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/base/media_export.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace media { 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class serves as a bridge for native code to call Java 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// functions in the Android MediaCodec class. See 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// http://developer.android.com/reference/android/media/MediaCodec.html. 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MEDIA_EXPORT WebAudioMediaCodecBridge { 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create the bridge with the given file descriptors. We read from 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |encoded_audio_handle| to get the encoded audio data. Audio file 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // information and decoded PCM samples are written to |pcm_output|. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We also take ownership of |pcm_output|. 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebAudioMediaCodecBridge(base::SharedMemoryHandle encoded_audio_handle, 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FileDescriptor pcm_output, 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) uint32_t data_size); 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~WebAudioMediaCodecBridge(); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Inform JNI about this bridge. Returns true if registration 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // succeeded. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool RegisterWebAudioMediaCodecBridge(JNIEnv* env); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start MediaCodec to process the encoded data in 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |encoded_audio_handle|. The PCM samples are sent to |pcm_output|. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void RunWebAudioMediaCodec( 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::SharedMemoryHandle encoded_audio_handle, 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FileDescriptor pcm_output, 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) uint32_t data_size); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnChunkDecoded(JNIEnv* env, 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jobject /*java object*/, 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jobject buf, 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jint buf_size, 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jint input_channel_count, 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jint output_channel_count); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void InitializeDestination(JNIEnv* env, 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jobject /*java object*/, 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jint channel_count, 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jint sample_rate, 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jlong duration_us); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Handles MediaCodec processing of the encoded data in 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |encoded_audio_handle_| and sends the pcm data to |pcm_output_|. 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true if decoding was successful. 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool DecodeInMemoryAudioFile(); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Save encoded audio data to a temporary file and return the file 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // descriptor to that file. -1 is returned if the audio data could 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // not be saved for any reason. 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int SaveEncodedAudioToFile(JNIEnv*, jobject); 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The encoded audio data is read from this file descriptor for the 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // shared memory that holds the encoded data. 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::SharedMemoryHandle encoded_audio_handle_; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The audio file information and decoded pcm data are written to 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // this file descriptor. We take ownership of this descriptor. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int pcm_output_; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The length of the encoded data. 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) uint32_t data_size_; 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebAudioMediaCodecBridge); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace media 80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#endif // MEDIA_BASE_ANDROID_WEBAUDIO_MEDIA_CODEC_BRIDGE_H_ 81