blob: fda612683fc6bdc8dc0cd8953f39c361f2594262 [file] [log] [blame]
// 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_