media_codec_bridge.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <jni.h> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/scoped_java_ref.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/base/audio_decoder_config.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/base/video_decoder_config.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstruct SubsampleEntry; 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// These must be in sync with MediaCodecBridge.MEDIA_CODEC_XXX constants in 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// MediaCodecBridge.java. 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)enum MediaCodecStatus { 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_OK, 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_DEQUEUE_INPUT_AGAIN_LATER, 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER, 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED, 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_OUTPUT_FORMAT_CHANGED, 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_INPUT_END_OF_STREAM, 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_OUTPUT_END_OF_STREAM, 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_NO_KEY, 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_STOPPED, 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MEDIA_CODEC_ERROR 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class serves as a bridge for native code to call java functions inside 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Android MediaCodec class. For more information on Android MediaCodec, check 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://developer.android.com/reference/android/media/MediaCodec.html 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note: MediaCodec is only available on JB and greater. 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use AudioCodecBridge or VideoCodecBridge to create an instance of this 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// object. 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class MEDIA_EXPORT MediaCodecBridge { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if MediaCodec is available on the device. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool IsAvailable(); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns whether MediaCodecBridge has a decoder that |is_secure| and can 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // decode |codec| type. 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static bool CanDecode(const std::string& codec, bool is_secure); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Represents supported codecs on android. |secure_decoder_supported| is true 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // if secure decoder is available for the codec type. 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(qinmin): Curretly the codecs string only contains one codec, do we 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // need more specific codecs separated by comma. (e.g. "vp8" -> "vp8, vp8.0") 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) struct CodecsInfo { 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string codecs; 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string name; 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool secure_decoder_supported; 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Get a list of supported codecs. 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static void GetCodecsInfo(std::vector<CodecsInfo>* codecs_info); 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~MediaCodecBridge(); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resets both input and output, all indices previously returned in calls to 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DequeueInputBuffer() and DequeueOutputBuffer() become invalid. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Please note that this clears all the inputs in the media codec. In other 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // words, there will be no outputs until new input is provided. 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns MEDIA_CODEC_ERROR if an unexpected error happens, or Media_CODEC_OK 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // otherwise. 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecStatus Reset(); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Finishes the decode/encode session. The instance remains active 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and ready to be StartAudio/Video()ed again. HOWEVER, due to the buggy 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // vendor's implementation , b/8125974, Stop() -> StartAudio/Video() may not 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // work on some devices. For reliability, Stop() -> delete and recreate new 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // instance -> StartAudio/Video() is recommended. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Stop(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used for getting output format. This is valid after DequeueInputBuffer() 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // returns a format change by returning INFO_OUTPUT_FORMAT_CHANGED 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetOutputFormat(int* width, int* height); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Submits a byte array to the given input buffer. Call this after getting an 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // available buffer from DequeueInputBuffer(). 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecStatus QueueInputBuffer(int index, 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const uint8* data, 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int size, 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::TimeDelta& presentation_time); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Similar to the above call, but submits a buffer that is encrypted. 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Note: NULL |subsamples| indicates the whole buffer is encrypted. 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecStatus QueueSecureInputBuffer( 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int index, 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const uint8* data, int data_size, 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const uint8* key_id, int key_id_size, 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const uint8* iv, int iv_size, 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SubsampleEntry* subsamples, int subsamples_size, 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::TimeDelta& presentation_time); 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Submits an empty buffer with a EOS (END OF STREAM) flag. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void QueueEOS(int input_buffer_index); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns: 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // MEDIA_CODEC_OK if an input buffer is ready to be filled with valid data, 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // MEDIA_CODEC_ENQUEUE_INPUT_AGAIN_LATER if no such buffer is available, or 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // MEDIA_CODEC_ERROR if unexpected error happens. 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Note: Never use infinite timeout as this would block the decoder thread and 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // prevent the decoder job from being released. 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecStatus DequeueInputBuffer(const base::TimeDelta& timeout, 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int* index); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Dequeues an output buffer, block at most timeout_us microseconds. 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns the status of this operation. If OK is returned, the output 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // parameters should be populated. Otherwise, the values of output parameters 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // should not be used. 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Note: Never use infinite timeout as this would block the decoder thread and 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // prevent the decoder job from being released. 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(xhwang): Can we drop |end_of_stream| and return 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // MEDIA_CODEC_OUTPUT_END_OF_STREAM? 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecStatus DequeueOutputBuffer(const base::TimeDelta& timeout, 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int* index, 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size_t* offset, 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size_t* size, 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta* presentation_time, 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool* end_of_stream); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the buffer to the codec. If you previously specified a surface 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when configuring this video decoder you can optionally render the buffer. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReleaseOutputBuffer(int index, bool render); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Gets output buffers from media codec and keeps them inside the java class. 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // To access them, use DequeueOutputBuffer(). Returns whether output buffers 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // were successfully obtained. 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool GetOutputBuffers() WARN_UNUSED_RESULT; 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static bool RegisterMediaCodecBridge(JNIEnv* env); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Returns true if |mime_type| is known to be unaccelerated (i.e. backed by a 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // software codec instead of a hardware one). 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static bool IsKnownUnaccelerated(const std::string& mime_type); 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecBridge(const std::string& mime, bool is_secure); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calls start() against the media codec instance. Used in StartXXX() after 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // configuring media codec. Returns whether media codec was successfully 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // started. 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool StartInternal() WARN_UNUSED_RESULT; 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jobject media_codec() { return j_media_codec_.obj(); } 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Fills a particular input buffer; returns false if |data_size| exceeds the 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // input buffer's capacity (and doesn't touch the input buffer in that case). 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool FillInputBuffer(int index, 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const uint8* data, 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int data_size) WARN_UNUSED_RESULT; 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Java MediaCodec instance. 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::android::ScopedJavaGlobalRef<jobject> j_media_codec_; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MediaCodecBridge); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AudioCodecBridge : public MediaCodecBridge { 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns an AudioCodecBridge instance if |codec| is supported, or a NULL 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // pointer otherwise. 1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static AudioCodecBridge* Create(const AudioCodec& codec); 1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // See MediaCodecBridge::IsKnownUnaccelerated(). 1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static bool IsKnownUnaccelerated(const AudioCodec& codec); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start the audio codec bridge. 1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool Start(const AudioCodec& codec, int sample_rate, int channel_count, 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* extra_data, size_t extra_data_size, 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool play_audio, jobject media_crypto) WARN_UNUSED_RESULT; 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Play the output buffer. This call must be called after 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // DequeueOutputBuffer() and before ReleaseOutputBuffer. 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void PlayOutputBuffer(int index, size_t size); 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Set the volume of the audio output. 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void SetVolume(double volume); 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit AudioCodecBridge(const std::string& mime); 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Configure the java MediaFormat object with the extra codec data passed in. 1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool ConfigureMediaFormat(jobject j_format, const AudioCodec& codec, 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const uint8* extra_data, size_t extra_data_size); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 196a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass MEDIA_EXPORT VideoCodecBridge : public MediaCodecBridge { 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns an VideoCodecBridge instance if |codec| is supported, or a NULL 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // pointer otherwise. 2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static VideoCodecBridge* Create(const VideoCodec& codec, bool is_secure); 2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // See MediaCodecBridge::IsKnownUnaccelerated(). 2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static bool IsKnownUnaccelerated(const VideoCodec& codec); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start the video codec bridge. 206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // TODO(qinmin): Pass codec specific data if available. 2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool Start(const VideoCodec& codec, const gfx::Size& size, jobject surface, 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch jobject media_crypto); 20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VideoCodecBridge(const std::string& mime, bool is_secure); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace media 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_ 217