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