Index: media/base/android/media_codec_bridge.h |
diff --git a/media/base/android/media_codec_bridge.h b/media/base/android/media_codec_bridge.h |
index cdd883f03120aa8cb89a2cf823ba031416413b2c..3a85019c603a1152cf34cd8dd1af49638e306f13 100644 |
--- a/media/base/android/media_codec_bridge.h |
+++ b/media/base/android/media_codec_bridge.h |
@@ -33,17 +33,29 @@ enum MediaCodecStatus { |
MEDIA_CODEC_ERROR |
}; |
+// Codec direction. Keep this in sync with MediaCodecBridge.java. |
+enum MediaCodecDirection { |
+ MEDIA_CODEC_DECODER, |
+ MEDIA_CODEC_ENCODER, |
+}; |
+ |
// This class serves as a bridge for native code to call java functions inside |
// Android MediaCodec class. For more information on Android MediaCodec, check |
// http://developer.android.com/reference/android/media/MediaCodec.html |
// Note: MediaCodec is only available on JB and greater. |
// Use AudioCodecBridge or VideoCodecBridge to create an instance of this |
// object. |
+// |
+// TODO(fischman,xhwang): replace this (and the enums that go with it) with |
+// chromium's JNI auto-generation hotness. |
class MEDIA_EXPORT MediaCodecBridge { |
public: |
// Returns true if MediaCodec is available on the device. |
static bool IsAvailable(); |
+ // Returns true if MediaCodec.setParameters() is available on the device. |
+ static bool SupportsSetParameters(); |
+ |
// Returns whether MediaCodecBridge has a decoder that |is_secure| and can |
// decode |codec| type. |
static bool CanDecode(const std::string& codec, bool is_secure); |
@@ -52,12 +64,13 @@ class MEDIA_EXPORT MediaCodecBridge { |
// TODO(qinmin): Curretly the codecs string only contains one codec, do we |
// need more specific codecs separated by comma. (e.g. "vp8" -> "vp8, vp8.0") |
struct CodecsInfo { |
- std::string codecs; |
- std::string name; |
+ std::string codecs; // E.g. "vp8" or "avc1". |
+ std::string name; // E.g. "OMX.google.vp8.decoder". |
+ MediaCodecDirection direction; |
}; |
// Get a list of supported codecs. |
- static void GetCodecsInfo(std::vector<CodecsInfo>* codecs_info); |
+ static std::vector<CodecsInfo> GetCodecsInfo(); |
virtual ~MediaCodecBridge(); |
@@ -80,21 +93,31 @@ class MEDIA_EXPORT MediaCodecBridge { |
// returns a format change by returning INFO_OUTPUT_FORMAT_CHANGED |
void GetOutputFormat(int* width, int* height); |
+ // Returns the number of input buffers used by the codec. |
+ int GetInputBuffersCount(); |
+ |
// Submits a byte array to the given input buffer. Call this after getting an |
- // available buffer from DequeueInputBuffer(). |
+ // available buffer from DequeueInputBuffer(). If |data| is NULL, assume the |
+ // input buffer has already been populated (but still obey |size|). |
MediaCodecStatus QueueInputBuffer(int index, |
const uint8* data, |
- int size, |
+ int orig_data_size, |
const base::TimeDelta& presentation_time); |
// Similar to the above call, but submits a buffer that is encrypted. |
- // Note: NULL |subsamples| indicates the whole buffer is encrypted. |
+ // Note: NULL |subsamples| indicates the whole buffer is encrypted. If |data| |
+ // is NULL, assume the input buffer has already been populated (but still obey |
+ // |data_size|). |
MediaCodecStatus QueueSecureInputBuffer( |
int index, |
- const uint8* data, int data_size, |
- const uint8* key_id, int key_id_size, |
- const uint8* iv, int iv_size, |
- const SubsampleEntry* subsamples, int subsamples_size, |
+ const uint8* data, |
+ int orig_data_size, |
+ const uint8* key_id, |
+ int key_id_size, |
+ const uint8* iv, |
+ int iv_size, |
+ const SubsampleEntry* subsamples, |
+ int subsamples_size, |
const base::TimeDelta& presentation_time); |
// Submits an empty buffer with a EOS (END OF STREAM) flag. |
@@ -112,7 +135,8 @@ class MEDIA_EXPORT MediaCodecBridge { |
// Dequeues an output buffer, block at most timeout_us microseconds. |
// Returns the status of this operation. If OK is returned, the output |
// parameters should be populated. Otherwise, the values of output parameters |
- // should not be used. |
+ // should not be used. Output parameters other than index/offset/size are |
+ // optional and only set if not NULL. |
// Note: Never use infinite timeout as this would block the decoder thread and |
// prevent the decoder job from being released. |
// TODO(xhwang): Can we drop |end_of_stream| and return |
@@ -122,25 +146,42 @@ class MEDIA_EXPORT MediaCodecBridge { |
size_t* offset, |
size_t* size, |
base::TimeDelta* presentation_time, |
- bool* end_of_stream); |
+ bool* end_of_stream, |
+ bool* key_frame); |
- // Returns the buffer to the codec. If you previously specified a surface |
- // when configuring this video decoder you can optionally render the buffer. |
+ // Returns the buffer to the codec. If you previously specified a surface when |
+ // configuring this video decoder you can optionally render the buffer. |
void ReleaseOutputBuffer(int index, bool render); |
+ // Returns the number of output buffers used by the codec. |
+ int GetOutputBuffersCount(); |
+ |
+ // Returns the capacity of each output buffer used by the codec. |
+ size_t GetOutputBuffersCapacity(); |
+ |
// Gets output buffers from media codec and keeps them inside the java class. |
// To access them, use DequeueOutputBuffer(). Returns whether output buffers |
// were successfully obtained. |
bool GetOutputBuffers() WARN_UNUSED_RESULT; |
+ // Returns an input buffer's base pointer and capacity. |
+ void GetInputBuffer(int input_buffer_index, uint8** data, size_t* capacity); |
+ |
+ // Copy |dst_size| bytes from output buffer |index|'s |offset| onwards into |
+ // |*dst|. |
+ bool CopyFromOutputBuffer(int index, size_t offset, void* dst, int dst_size); |
+ |
static bool RegisterMediaCodecBridge(JNIEnv* env); |
protected: |
// Returns true if |mime_type| is known to be unaccelerated (i.e. backed by a |
// software codec instead of a hardware one). |
- static bool IsKnownUnaccelerated(const std::string& mime_type); |
+ static bool IsKnownUnaccelerated(const std::string& mime_type, |
+ MediaCodecDirection direction); |
- MediaCodecBridge(const std::string& mime, bool is_secure); |
+ MediaCodecBridge(const std::string& mime, |
+ bool is_secure, |
+ MediaCodecDirection direction); |
// Calls start() against the media codec instance. Used in StartXXX() after |
// configuring media codec. Returns whether media codec was successfully |
@@ -148,13 +189,14 @@ class MEDIA_EXPORT MediaCodecBridge { |
bool StartInternal() WARN_UNUSED_RESULT; |
jobject media_codec() { return j_media_codec_.obj(); } |
+ MediaCodecDirection direction_; |
private: |
// Fills a particular input buffer; returns false if |data_size| exceeds the |
// input buffer's capacity (and doesn't touch the input buffer in that case). |
bool FillInputBuffer(int index, |
const uint8* data, |
- int data_size) WARN_UNUSED_RESULT; |
+ size_t data_size) WARN_UNUSED_RESULT; |
// Java MediaCodec instance. |
base::android::ScopedJavaGlobalRef<jobject> j_media_codec_; |
@@ -193,20 +235,34 @@ class AudioCodecBridge : public MediaCodecBridge { |
class MEDIA_EXPORT VideoCodecBridge : public MediaCodecBridge { |
public: |
- // Returns an VideoCodecBridge instance if |codec| is supported, or a NULL |
- // pointer otherwise. |
- static VideoCodecBridge* Create(const VideoCodec& codec, bool is_secure); |
- |
// See MediaCodecBridge::IsKnownUnaccelerated(). |
- static bool IsKnownUnaccelerated(const VideoCodec& codec); |
- |
- // Start the video codec bridge. |
- // TODO(qinmin): Pass codec specific data if available. |
- bool Start(const VideoCodec& codec, const gfx::Size& size, jobject surface, |
- jobject media_crypto); |
+ static bool IsKnownUnaccelerated(const VideoCodec& codec, |
+ MediaCodecDirection direction); |
+ |
+ // Create, start, and return a VideoCodecBridge decoder or NULL on failure. |
+ static VideoCodecBridge* CreateDecoder( |
+ const VideoCodec& codec, // e.g. media::kCodecVP8 |
+ bool is_secure, |
+ const gfx::Size& size, // Output frame size. |
+ jobject surface, // Output surface, optional. |
+ jobject media_crypto); // MediaCrypto object, optional. |
+ |
+ // Create, start, and return a VideoCodecBridge encoder or NULL on failure. |
+ static VideoCodecBridge* CreateEncoder( |
+ const VideoCodec& codec, // e.g. media::kCodecVP8 |
+ const gfx::Size& size, // input frame size |
+ int bit_rate, // bits/second |
+ int frame_rate, // frames/second |
+ int i_frame_interval, // count |
+ int color_format); // MediaCodecInfo.CodecCapabilities. |
+ |
+ void SetVideoBitrate(int bps); |
+ void RequestKeyFrameSoon(); |
private: |
- VideoCodecBridge(const std::string& mime, bool is_secure); |
+ VideoCodecBridge(const std::string& mime, |
+ bool is_secure, |
+ MediaCodecDirection direction); |
}; |
} // namespace media |