diff options
author | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-08 16:45:25 +0000 |
---|---|---|
committer | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-08 16:45:25 +0000 |
commit | 486238b191a6d7439dcda4aa04c662e2e3edd608 (patch) | |
tree | c83dda4d8d8c76d3e06ada306bf56d44e2e57210 /media | |
parent | 5e1119d34a7d393ab4df4a1f9a1722b05a700979 (diff) | |
download | chromium_src-486238b191a6d7439dcda4aa04c662e2e3edd608.zip chromium_src-486238b191a6d7439dcda4aa04c662e2e3edd608.tar.gz chromium_src-486238b191a6d7439dcda4aa04c662e2e3edd608.tar.bz2 |
Replace av_malloc with AlignedAlloc for memory allocation in VideoFrame.
See also r157836.
BUG=150920
TEST=media_unittests
Review URL: https://chromiumcodereview.appspot.com/11308310
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171976 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/base/video_frame.cc | 40 | ||||
-rw-r--r-- | media/base/video_frame.h | 6 | ||||
-rw-r--r-- | media/ffmpeg/ffmpeg_common.cc | 26 |
3 files changed, 35 insertions, 37 deletions
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index 28b4f9e..71bdcf4 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc @@ -9,12 +9,10 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/logging.h" +#include "base/memory/aligned_memory.h" #include "base/string_piece.h" #include "media/base/limits.h" #include "media/base/video_util.h" -#if !defined(OS_ANDROID) -#include "media/ffmpeg/ffmpeg_common.h" -#endif namespace media { @@ -72,9 +70,8 @@ scoped_refptr<VideoFrame> VideoFrame::WrapNativeTexture( base::TimeDelta timestamp, const ReadPixelsCB& read_pixels_cb, const base::Closure& no_longer_needed_cb) { - scoped_refptr<VideoFrame> frame( - new VideoFrame(NATIVE_TEXTURE, coded_size, visible_rect, natural_size, - timestamp)); + scoped_refptr<VideoFrame> frame(new VideoFrame( + NATIVE_TEXTURE, coded_size, visible_rect, natural_size, timestamp)); frame->texture_id_ = texture_id; frame->texture_target_ = texture_target; frame->read_pixels_cb_ = read_pixels_cb; @@ -144,20 +141,10 @@ static inline size_t RoundUp(size_t value, size_t alignment) { return ((value + (alignment - 1)) & ~(alignment-1)); } -static const int kFrameSizeAlignment = 16; -// Allows faster SIMD YUV convert. Also, FFmpeg overreads/-writes occasionally. -static const int kFramePadBytes = 15; - // Release data allocated by AllocateRGB() or AllocateYUV(). static void ReleaseData(uint8* data) { DCHECK(data); - if (data) { -#if !defined(OS_ANDROID) - av_free(data); -#else - delete[] data; -#endif - } + base::AlignedFree(data); } void VideoFrame::AllocateRGB(size_t bytes_per_pixel) { @@ -167,14 +154,9 @@ void VideoFrame::AllocateRGB(size_t bytes_per_pixel) { kFrameSizeAlignment) * bytes_per_pixel; size_t aligned_height = RoundUp(coded_size_.height(), kFrameSizeAlignment); strides_[VideoFrame::kRGBPlane] = bytes_per_row; -#if !defined(OS_ANDROID) - // TODO(dalecurtis): use DataAligned or so, so this #ifdef hackery - // doesn't need to be repeated in every single user of aligned data. data_[VideoFrame::kRGBPlane] = reinterpret_cast<uint8*>( - av_malloc(bytes_per_row * aligned_height + kFramePadBytes)); -#else - data_[VideoFrame::kRGBPlane] = new uint8_t[bytes_per_row * aligned_height]; -#endif + base::AlignedAlloc(bytes_per_row * aligned_height + kFrameSizePadding, + kFrameAddressAlignment)); no_longer_needed_cb_ = base::Bind(&ReleaseData, data_[VideoFrame::kRGBPlane]); DCHECK(!(reinterpret_cast<intptr_t>(data_[VideoFrame::kRGBPlane]) & 7)); COMPILE_ASSERT(0 == VideoFrame::kRGBPlane, RGB_data_must_be_index_0); @@ -203,18 +185,14 @@ void VideoFrame::AllocateYUV() { size_t y_bytes = y_height * y_stride; size_t uv_bytes = uv_height * uv_stride; -#if !defined(OS_ANDROID) - // TODO(dalecurtis): use DataAligned or so, so this #ifdef hackery - // doesn't need to be repeated in every single user of aligned data. // The extra line of UV being allocated is because h264 chroma MC // overreads by one line in some cases, see libavcodec/utils.c: // avcodec_align_dimensions2() and libavcodec/x86/h264_chromamc.asm: // put_h264_chroma_mc4_ssse3(). uint8* data = reinterpret_cast<uint8*>( - av_malloc(y_bytes + (uv_bytes * 2 + uv_stride) + kFramePadBytes)); -#else - uint8* data = new uint8_t[y_bytes + (uv_bytes * 2)]; -#endif + base::AlignedAlloc( + y_bytes + (uv_bytes * 2 + uv_stride) + kFrameSizePadding, + kFrameAddressAlignment)); no_longer_needed_cb_ = base::Bind(&ReleaseData, data); COMPILE_ASSERT(0 == VideoFrame::kYPlane, y_plane_data_must_be_index_0); data_[VideoFrame::kYPlane] = data; diff --git a/media/base/video_frame.h b/media/base/video_frame.h index 09e6b43..3483e91 100644 --- a/media/base/video_frame.h +++ b/media/base/video_frame.h @@ -16,6 +16,12 @@ namespace media { class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> { public: enum { + kFrameSizeAlignment = 16, + kFrameSizePadding = 16, + kFrameAddressAlignment = 32 + }; + + enum { kMaxPlanes = 3, kRGBPlane = 0, diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index e487c49..c79e480 100644 --- a/media/ffmpeg/ffmpeg_common.cc +++ b/media/ffmpeg/ffmpeg_common.cc @@ -7,6 +7,7 @@ #include "base/basictypes.h" #include "base/logging.h" #include "media/base/decoder_buffer.h" +#include "media/base/video_frame.h" #include "media/base/video_util.h" namespace media { @@ -17,19 +18,32 @@ namespace media { COMPILE_ASSERT(DecoderBuffer::kPaddingSize >= FF_INPUT_BUFFER_PADDING_SIZE, decoder_buffer_padding_size_does_not_fit_ffmpeg_requirement); -// Alignment requirement by FFmpeg for input buffers. This need to be updated -// to match FFmpeg when it changes. +// Alignment requirement by FFmpeg for input and output buffers. This need to +// be updated to match FFmpeg when it changes. #if defined(ARCH_CPU_ARM_FAMILY) -static const int kFFmpegInputBufferAlignmentSize = 16; +static const int kFFmpegBufferAddressAlignment = 16; #else -static const int kFFmpegInputBufferAlignmentSize = 32; +static const int kFFmpegBufferAddressAlignment = 32; #endif + // Check here to ensure FFmpeg only receives data aligned to its specifications. COMPILE_ASSERT( - DecoderBuffer::kAlignmentSize >= kFFmpegInputBufferAlignmentSize && - DecoderBuffer::kAlignmentSize % kFFmpegInputBufferAlignmentSize == 0, + DecoderBuffer::kAlignmentSize >= kFFmpegBufferAddressAlignment && + DecoderBuffer::kAlignmentSize % kFFmpegBufferAddressAlignment == 0, decoder_buffer_alignment_size_does_not_fit_ffmpeg_requirement); +// Allows faster SIMD YUV convert. Also, FFmpeg overreads/-writes occasionally. +// See video_get_buffer() in libavcodec/utils.c. +static const int kFFmpegOutputBufferPaddingSize = 16; + +COMPILE_ASSERT(VideoFrame::kFrameSizePadding >= kFFmpegOutputBufferPaddingSize, + video_frame_padding_size_does_not_fit_ffmpeg_requirement); + +COMPILE_ASSERT( + VideoFrame::kFrameAddressAlignment >= kFFmpegBufferAddressAlignment && + VideoFrame::kFrameAddressAlignment % kFFmpegBufferAddressAlignment == 0, + video_frame_address_alignment_does_not_fit_ffmpeg_requirement); + static const AVRational kMicrosBase = { 1, base::Time::kMicrosecondsPerSecond }; base::TimeDelta ConvertFromTimeBase(const AVRational& time_base, |