diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-20 20:05:07 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-20 20:05:07 +0000 |
commit | 1be621f1d1df8231a02e12d8a0b49c0910660469 (patch) | |
tree | d28ce5c03db17487606dbf60a4a64fd14240a366 /media/base | |
parent | a5d8fac6d37dec61810f55c6f49790644053e88f (diff) | |
download | chromium_src-1be621f1d1df8231a02e12d8a0b49c0910660469.zip chromium_src-1be621f1d1df8231a02e12d8a0b49c0910660469.tar.gz chromium_src-1be621f1d1df8231a02e12d8a0b49c0910660469.tar.bz2 |
Use av_rescale_q() for converting FFmpeg timestamps to base::TimeDelta (second attempt).
Previously we were using integer math to convert to microseconds, but depending on the frame rate and packet size we could introduce enough error that could accumulate and introduce audio/video synchronization drift. av_rescale_q() is a simple function but is designed to minimize error as much as possible.
Second attempt since I forgot to manually resolve av_rescale_q() for unittests.
Review URL: http://codereview.chromium.org/113619
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16514 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base')
-rw-r--r-- | media/base/media_posix.cc | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/media/base/media_posix.cc b/media/base/media_posix.cc index 4bddf6d..94c1a89 100644 --- a/media/base/media_posix.cc +++ b/media/base/media_posix.cc @@ -122,6 +122,11 @@ void av_free(void* ptr) { return av_free_ptr(ptr); } +int64_t (*av_rescale_q_ptr)(int64_t a, AVRational bq, AVRational cq) = NULL; +int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) { + return av_rescale_q_ptr(a, bq, cq); +} + } // extern "C" @@ -240,6 +245,9 @@ bool InitializeMediaLibrary(const FilePath& module_dir) { av_free_ptr = reinterpret_cast<void (*)(void*)>( dlsym(libs[FILE_LIBAVUTIL], "av_free")); + av_rescale_q_ptr = + reinterpret_cast<int64_t (*)(int64_t, AVRational, AVRational)>( + dlsym(libs[FILE_LIBAVUTIL], "av_rescale_q")); // Check that all the symbols were loaded correctly before returning true. if (av_get_bits_per_sample_format_ptr && @@ -259,7 +267,8 @@ bool InitializeMediaLibrary(const FilePath& module_dir) { av_register_protocol_ptr && av_malloc_ptr && - av_free_ptr) { + av_free_ptr && + av_rescale_q_ptr) { return true; } |