OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/ffmpeg/ffmpeg_common.h" | 5 #include "media/ffmpeg/ffmpeg_common.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "media/base/decoder_buffer.h" | 9 #include "media/base/decoder_buffer.h" |
| 10 #include "media/base/video_frame.h" |
10 #include "media/base/video_util.h" | 11 #include "media/base/video_util.h" |
11 | 12 |
12 namespace media { | 13 namespace media { |
13 | 14 |
14 // Why FF_INPUT_BUFFER_PADDING_SIZE? FFmpeg assumes all input buffers are | 15 // Why FF_INPUT_BUFFER_PADDING_SIZE? FFmpeg assumes all input buffers are |
15 // padded. Check here to ensure FFmpeg only receives data padded to its | 16 // padded. Check here to ensure FFmpeg only receives data padded to its |
16 // specifications. | 17 // specifications. |
17 COMPILE_ASSERT(DecoderBuffer::kPaddingSize >= FF_INPUT_BUFFER_PADDING_SIZE, | 18 COMPILE_ASSERT(DecoderBuffer::kPaddingSize >= FF_INPUT_BUFFER_PADDING_SIZE, |
18 decoder_buffer_padding_size_does_not_fit_ffmpeg_requirement); | 19 decoder_buffer_padding_size_does_not_fit_ffmpeg_requirement); |
19 | 20 |
20 // Alignment requirement by FFmpeg for input buffers. This need to be updated | 21 // Alignment requirement by FFmpeg for input and output buffers. This need to |
21 // to match FFmpeg when it changes. | 22 // be updated to match FFmpeg when it changes. |
22 #if defined(ARCH_CPU_ARM_FAMILY) | 23 #if defined(ARCH_CPU_ARM_FAMILY) |
23 static const int kFFmpegInputBufferAlignmentSize = 16; | 24 static const int kFFmpegBufferAddressAlignment = 16; |
24 #else | 25 #else |
25 static const int kFFmpegInputBufferAlignmentSize = 32; | 26 static const int kFFmpegBufferAddressAlignment = 32; |
26 #endif | 27 #endif |
| 28 |
27 // Check here to ensure FFmpeg only receives data aligned to its specifications. | 29 // Check here to ensure FFmpeg only receives data aligned to its specifications. |
28 COMPILE_ASSERT( | 30 COMPILE_ASSERT( |
29 DecoderBuffer::kAlignmentSize >= kFFmpegInputBufferAlignmentSize && | 31 DecoderBuffer::kAlignmentSize >= kFFmpegBufferAddressAlignment && |
30 DecoderBuffer::kAlignmentSize % kFFmpegInputBufferAlignmentSize == 0, | 32 DecoderBuffer::kAlignmentSize % kFFmpegBufferAddressAlignment == 0, |
31 decoder_buffer_alignment_size_does_not_fit_ffmpeg_requirement); | 33 decoder_buffer_alignment_size_does_not_fit_ffmpeg_requirement); |
32 | 34 |
| 35 // Allows faster SIMD YUV convert. Also, FFmpeg overreads/-writes occasionally. |
| 36 // See video_get_buffer() in libavcodec/utils.c. |
| 37 static const int kFFmpegOutputBufferPaddingSize = 16; |
| 38 |
| 39 COMPILE_ASSERT(VideoFrame::kFrameSizePadding >= kFFmpegOutputBufferPaddingSize, |
| 40 video_frame_padding_size_does_not_fit_ffmpeg_requirement); |
| 41 |
| 42 COMPILE_ASSERT( |
| 43 VideoFrame::kFrameAddressAlignment >= kFFmpegBufferAddressAlignment && |
| 44 VideoFrame::kFrameAddressAlignment % kFFmpegBufferAddressAlignment == 0, |
| 45 video_frame_address_alignment_does_not_fit_ffmpeg_requirement); |
| 46 |
33 static const AVRational kMicrosBase = { 1, base::Time::kMicrosecondsPerSecond }; | 47 static const AVRational kMicrosBase = { 1, base::Time::kMicrosecondsPerSecond }; |
34 | 48 |
35 base::TimeDelta ConvertFromTimeBase(const AVRational& time_base, | 49 base::TimeDelta ConvertFromTimeBase(const AVRational& time_base, |
36 int64 timestamp) { | 50 int64 timestamp) { |
37 int64 microseconds = av_rescale_q(timestamp, time_base, kMicrosBase); | 51 int64 microseconds = av_rescale_q(timestamp, time_base, kMicrosBase); |
38 return base::TimeDelta::FromMicroseconds(microseconds); | 52 return base::TimeDelta::FromMicroseconds(microseconds); |
39 } | 53 } |
40 | 54 |
41 int64 ConvertToTimeBase(const AVRational& time_base, | 55 int64 ConvertToTimeBase(const AVRational& time_base, |
42 const base::TimeDelta& timestamp) { | 56 const base::TimeDelta& timestamp) { |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 return PIX_FMT_YUV422P; | 421 return PIX_FMT_YUV422P; |
408 case VideoFrame::YV12: | 422 case VideoFrame::YV12: |
409 return PIX_FMT_YUV420P; | 423 return PIX_FMT_YUV420P; |
410 default: | 424 default: |
411 DVLOG(1) << "Unsupported VideoFrame::Format: " << video_format; | 425 DVLOG(1) << "Unsupported VideoFrame::Format: " << video_format; |
412 } | 426 } |
413 return PIX_FMT_NONE; | 427 return PIX_FMT_NONE; |
414 } | 428 } |
415 | 429 |
416 } // namespace media | 430 } // namespace media |
OLD | NEW |