summaryrefslogtreecommitdiffstats
path: root/media/base
diff options
context:
space:
mode:
authorajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-22 23:59:14 +0000
committerajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-22 23:59:14 +0000
commitb2520c779bce29b5ee0613dbb84d93fef0bdb3ea (patch)
treeb0757b50cec03a177917a0c73daf1c7eeb3b174a /media/base
parent60287ffd30023b51d7f183abb6948a63f9f1eb90 (diff)
downloadchromium_src-b2520c779bce29b5ee0613dbb84d93fef0bdb3ea.zip
chromium_src-b2520c779bce29b5ee0613dbb84d93fef0bdb3ea.tar.gz
chromium_src-b2520c779bce29b5ee0613dbb84d93fef0bdb3ea.tar.bz2
Refactor FFmpegVideoDecoder::OnDecode and unittest and add state tracking.
The decoder needs a concept of state to know when it should just stop attempting to decode. This is because ffmpeg will sometimes gives spurious frames back, which plays badly with the time presentation timestamp calculation logic. Review URL: http://codereview.chromium.org/132013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18990 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base')
-rw-r--r--media/base/buffers.h1
-rw-r--r--media/base/mock_ffmpeg.cc41
-rw-r--r--media/base/mock_ffmpeg.h10
3 files changed, 29 insertions, 23 deletions
diff --git a/media/base/buffers.h b/media/base/buffers.h
index 6fa0cfe..def573e 100644
--- a/media/base/buffers.h
+++ b/media/base/buffers.h
@@ -132,6 +132,7 @@ struct VideoSurface {
// http://www.fourcc.org/rgb.php
// http://www.fourcc.org/yuv.php
enum Format {
+ INVALID, // Invalid format value. Used for error reporting.
RGB555, // 16bpp RGB packed 5:5:5
RGB565, // 16bpp RGB packed 5:6:5
RGB24, // 24bpp RGB packed 8:8:8
diff --git a/media/base/mock_ffmpeg.cc b/media/base/mock_ffmpeg.cc
index b1de0c4..8a397de 100644
--- a/media/base/mock_ffmpeg.cc
+++ b/media/base/mock_ffmpeg.cc
@@ -62,22 +62,17 @@ int avcodec_thread_init(AVCodecContext* avctx, int threads) {
}
void avcodec_flush_buffers(AVCodecContext* avctx) {
- NOTREACHED();
+ return media::MockFFmpeg::get()->AVCodecFlushBuffers(avctx);
}
AVFrame* avcodec_alloc_frame() {
- NOTREACHED();
- return NULL;
+ return media::MockFFmpeg::get()->AVCodecAllocFrame();
}
int avcodec_decode_video2(AVCodecContext* avctx, AVFrame* picture,
int* got_picture_ptr, AVPacket* avpkt) {
- NOTREACHED();
- return 0;
-}
-
-void av_init_packet(AVPacket* pkt) {
- NOTREACHED();
+ return media::MockFFmpeg::get()->
+ AVCodecDecodeVideo2(avctx, picture, got_picture_ptr, avpkt);
}
int av_open_input_file(AVFormatContext** format, const char* filename,
@@ -100,14 +95,28 @@ int64 av_rescale_q(int64 a, AVRational bq, AVRational cq) {
return a * num / den;
}
-void av_free_packet(AVPacket* packet) {
- media::MockFFmpeg::get()->AVFreePacket(packet);
+int av_read_frame(AVFormatContext* format, AVPacket* packet) {
+ return media::MockFFmpeg::get()->AVReadFrame(format, packet);
+}
+
+int av_seek_frame(AVFormatContext *format, int stream_index, int64_t timestamp,
+ int flags) {
+ return media::MockFFmpeg::get()->AVSeekFrame(format, stream_index, timestamp,
+ flags);
+}
+
+void av_init_packet(AVPacket* pkt) {
+ return media::MockFFmpeg::get()->AVInitPacket(pkt);
}
int av_new_packet(AVPacket* packet, int size) {
return media::MockFFmpeg::get()->AVNewPacket(packet, size);
}
+void av_free_packet(AVPacket* packet) {
+ media::MockFFmpeg::get()->AVFreePacket(packet);
+}
+
void av_free(void* ptr) {
// Freeing NULL pointers are valid, but they aren't interesting from a mock
// perspective.
@@ -116,16 +125,6 @@ void av_free(void* ptr) {
}
}
-int av_read_frame(AVFormatContext* format, AVPacket* packet) {
- return media::MockFFmpeg::get()->AVReadFrame(format, packet);
-}
-
-int av_seek_frame(AVFormatContext *format, int stream_index, int64_t timestamp,
- int flags) {
- return media::MockFFmpeg::get()->AVSeekFrame(format, stream_index, timestamp,
- flags);
-}
-
} // extern "C"
} // namespace media
diff --git a/media/base/mock_ffmpeg.h b/media/base/mock_ffmpeg.h
index 597898e..70f34e3 100644
--- a/media/base/mock_ffmpeg.h
+++ b/media/base/mock_ffmpeg.h
@@ -14,11 +14,16 @@ namespace media {
class MockFFmpeg {
public:
MockFFmpeg();
- ~MockFFmpeg();
+ virtual ~MockFFmpeg();
MOCK_METHOD1(AVCodecFindDecoder, AVCodec*(enum CodecID id));
MOCK_METHOD2(AVCodecOpen, int(AVCodecContext* avctx, AVCodec* codec));
MOCK_METHOD2(AVCodecThreadInit, int(AVCodecContext* avctx, int threads));
+ MOCK_METHOD1(AVCodecFlushBuffers, void(AVCodecContext* avctx));
+ MOCK_METHOD0(AVCodecAllocFrame, AVFrame*());
+ MOCK_METHOD4(AVCodecDecodeVideo2,
+ int(AVCodecContext* avctx, AVFrame* picture,
+ int* got_picture_ptr, AVPacket* avpkt));
MOCK_METHOD5(AVOpenInputFile, int(AVFormatContext** format,
const char* filename,
@@ -32,9 +37,10 @@ class MockFFmpeg {
int64_t timestamp,
int flags));
+ MOCK_METHOD1(AVInitPacket, void(AVPacket* pkt));
MOCK_METHOD2(AVNewPacket, int(AVPacket* packet, int size));
- MOCK_METHOD1(AVFree, void(void* ptr));
MOCK_METHOD1(AVFreePacket, void(AVPacket* packet));
+ MOCK_METHOD1(AVFree, void(void* ptr));
// Used for verifying check points during tests.
MOCK_METHOD1(CheckPoint, void(int id));