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/filters/ffmpeg_audio_decoder.h" | 5 #include "media/filters/ffmpeg_audio_decoder.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 const scoped_refptr<DecoderBuffer>& input) { | 27 const scoped_refptr<DecoderBuffer>& input) { |
28 // Three conditions to meet to declare end of stream for this decoder: | 28 // Three conditions to meet to declare end of stream for this decoder: |
29 // 1. FFmpeg didn't read anything. | 29 // 1. FFmpeg didn't read anything. |
30 // 2. FFmpeg didn't output anything. | 30 // 2. FFmpeg didn't output anything. |
31 // 3. An end of stream buffer is received. | 31 // 3. An end of stream buffer is received. |
32 return result == 0 && decoded_size == 0 && input->end_of_stream(); | 32 return result == 0 && decoded_size == 0 && input->end_of_stream(); |
33 } | 33 } |
34 | 34 |
35 // Return the number of channels from the data in |frame|. | 35 // Return the number of channels from the data in |frame|. |
36 static inline int DetermineChannels(AVFrame* frame) { | 36 static inline int DetermineChannels(AVFrame* frame) { |
37 #if defined(CHROMIUM_NO_AVFRAME_CHANNELS) | |
38 // When use_system_ffmpeg==1, libav's AVFrame doesn't have channels field. | |
39 return av_get_channel_layout_nb_channels(frame->channel_layout); | |
40 #else | |
41 return frame->channels; | 37 return frame->channels; |
42 #endif | |
43 } | 38 } |
44 | 39 |
45 // Called by FFmpeg's allocation routine to allocate a buffer. Uses | 40 // Called by FFmpeg's allocation routine to allocate a buffer. Uses |
46 // AVCodecContext.opaque to get the object reference in order to call | 41 // AVCodecContext.opaque to get the object reference in order to call |
47 // GetAudioBuffer() to do the actual allocation. | 42 // GetAudioBuffer() to do the actual allocation. |
48 static int GetAudioBufferImpl(struct AVCodecContext* s, | 43 static int GetAudioBufferImpl(struct AVCodecContext* s, |
49 AVFrame* frame, | 44 AVFrame* frame, |
50 int flags) { | 45 int flags) { |
51 FFmpegAudioDecoder* decoder = static_cast<FFmpegAudioDecoder*>(s->opaque); | 46 FFmpegAudioDecoder* decoder = static_cast<FFmpegAudioDecoder*>(s->opaque); |
52 return decoder->GetAudioBuffer(s, frame, flags); | 47 return decoder->GetAudioBuffer(s, frame, flags); |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 // Now create an AVBufferRef for the data just allocated. It will own the | 451 // Now create an AVBufferRef for the data just allocated. It will own the |
457 // reference to the AudioBuffer object. | 452 // reference to the AudioBuffer object. |
458 AudioBuffer* opaque = buffer.get(); | 453 AudioBuffer* opaque = buffer.get(); |
459 opaque->AddRef(); | 454 opaque->AddRef(); |
460 frame->buf[0] = av_buffer_create(frame->data[0], buffer_size_in_bytes, | 455 frame->buf[0] = av_buffer_create(frame->data[0], buffer_size_in_bytes, |
461 ReleaseAudioBufferImpl, opaque, 0); | 456 ReleaseAudioBufferImpl, opaque, 0); |
462 return 0; | 457 return 0; |
463 } | 458 } |
464 | 459 |
465 } // namespace media | 460 } // namespace media |
OLD | NEW |