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
3 // found in the LICENSE file.
4 
5 #ifndef MEDIA_FFMPEG_FFMPEG_COMMON_H_
6 #define MEDIA_FFMPEG_FFMPEG_COMMON_H_
7 
8 #include <stdint.h>
9 #include <string>
10 
11 // Used for FFmpeg error codes.
12 #include <cerrno>
13 
14 #include "base/compiler_specific.h"
15 #include "base/time/time.h"
16 #include "media/base/audio_codecs.h"
17 #include "media/base/channel_layout.h"
18 #include "media/base/encryption_scheme.h"
19 #include "media/base/media_export.h"
20 #include "media/base/sample_format.h"
21 #include "media/base/video_codecs.h"
22 #include "media/base/video_frame.h"
23 #include "media/ffmpeg/ffmpeg_deleters.h"
24 #include "third_party/ffmpeg/ffmpeg_features.h"
25 
26 // Include FFmpeg header files.
27 extern "C" {
28 #include <libavcodec/avcodec.h>
29 #include <libavformat/avformat.h>
30 #include <libavformat/avio.h>
31 #include <libavutil/avutil.h>
32 #include <libavutil/imgutils.h>
33 #include <libavutil/log.h>
34 #include <libavutil/mastering_display_metadata.h>
35 #include <libavutil/mathematics.h>
36 #include <libavutil/opt.h>
37 }  // extern "C"
38 
39 namespace media {
40 
41 constexpr int64_t kNoFFmpegTimestamp = static_cast<int64_t>(AV_NOPTS_VALUE);
42 
43 class AudioDecoderConfig;
44 class VideoDecoderConfig;
45 
46 // The following implement the deleters declared in ffmpeg_deleters.h (which
47 // contains the declarations needed for use with |scoped_ptr| without #include
48 // "pollution").
49 
operator()50 inline void ScopedPtrAVFree::operator()(void* x) const {
51   av_free(x);
52 }
53 
operator()54 inline void ScopedPtrAVFreePacket::operator()(void* x) const {
55   AVPacket* packet = static_cast<AVPacket*>(x);
56   av_packet_unref(packet);
57   delete packet;
58 }
59 
operator()60 inline void ScopedPtrAVFreeContext::operator()(void* x) const {
61   AVCodecContext* codec_context = static_cast<AVCodecContext*>(x);
62   avcodec_free_context(&codec_context);
63 }
64 
operator()65 inline void ScopedPtrAVFreeFrame::operator()(void* x) const {
66   AVFrame* frame = static_cast<AVFrame*>(x);
67   av_frame_free(&frame);
68 }
69 
70 // Converts an int64_t timestamp in |time_base| units to a base::TimeDelta.
71 // For example if |timestamp| equals 11025 and |time_base| equals {1, 44100}
72 // then the return value will be a base::TimeDelta for 0.25 seconds since that
73 // is how much time 11025/44100ths of a second represents.
74 MEDIA_EXPORT base::TimeDelta ConvertFromTimeBase(const AVRational& time_base,
75                                                  int64_t timestamp);
76 
77 // Converts a base::TimeDelta into an int64_t timestamp in |time_base| units.
78 // For example if |timestamp| is 0.5 seconds and |time_base| is {1, 44100}, then
79 // the return value will be 22050 since that is how many 1/44100ths of a second
80 // represent 0.5 seconds.
81 MEDIA_EXPORT int64_t ConvertToTimeBase(const AVRational& time_base,
82                                        const base::TimeDelta& timestamp);
83 
84 // Converts an FFmpeg audio codec ID into its corresponding supported codec id.
85 MEDIA_EXPORT AudioCodec CodecIDToAudioCodec(AVCodecID codec_id);
86 
87 // Allocates, populates and returns a wrapped AVCodecContext from the
88 // AVCodecParameters in |stream|. On failure, returns a wrapped nullptr.
89 // Wrapping helps ensure eventual destruction of the AVCodecContext.
90 MEDIA_EXPORT std::unique_ptr<AVCodecContext, ScopedPtrAVFreeContext>
91 AVStreamToAVCodecContext(const AVStream* stream);
92 
93 // Returns true if AVStream is successfully converted to a AudioDecoderConfig.
94 // Returns false if conversion fails, in which case |config| is not modified.
95 MEDIA_EXPORT bool AVStreamToAudioDecoderConfig(const AVStream* stream,
96                                                AudioDecoderConfig* config);
97 void AudioDecoderConfigToAVCodecContext(
98     const AudioDecoderConfig& config,
99     AVCodecContext* codec_context);
100 
101 // Returns true if AVStream is successfully converted to a VideoDecoderConfig.
102 // Returns false if conversion fails, in which case |config| is not modified.
103 MEDIA_EXPORT bool AVStreamToVideoDecoderConfig(const AVStream* stream,
104                                                VideoDecoderConfig* config);
105 void VideoDecoderConfigToAVCodecContext(
106     const VideoDecoderConfig& config,
107     AVCodecContext* codec_context);
108 
109 // Returns true if AVCodecContext is successfully converted to an
110 // AudioDecoderConfig. Returns false if conversion fails, in which case |config|
111 // is not modified.
112 MEDIA_EXPORT bool AVCodecContextToAudioDecoderConfig(
113     const AVCodecContext* codec_context,
114     EncryptionScheme encryption_scheme,
115     AudioDecoderConfig* config);
116 
117 // Converts FFmpeg's channel layout to chrome's ChannelLayout.  |channels| can
118 // be used when FFmpeg's channel layout is not informative in order to make a
119 // good guess about the plausible channel layout based on number of channels.
120 MEDIA_EXPORT ChannelLayout ChannelLayoutToChromeChannelLayout(int64_t layout,
121                                                               int channels);
122 
123 MEDIA_EXPORT AVCodecID AudioCodecToCodecID(AudioCodec audio_codec,
124                                            SampleFormat sample_format);
125 MEDIA_EXPORT AVCodecID VideoCodecToCodecID(VideoCodec video_codec);
126 
127 // Converts FFmpeg's audio sample format to Chrome's SampleFormat.
128 MEDIA_EXPORT SampleFormat
129 AVSampleFormatToSampleFormat(AVSampleFormat sample_format, AVCodecID codec_id);
130 
131 // Converts FFmpeg's pixel formats to its corresponding supported video format.
132 MEDIA_EXPORT VideoPixelFormat
133 AVPixelFormatToVideoPixelFormat(AVPixelFormat pixel_format);
134 
135 VideoColorSpace AVColorSpaceToColorSpace(AVColorSpace color_space,
136                                          AVColorRange color_range);
137 
138 // Converts an AVERROR error number to a description.
139 std::string AVErrorToString(int errnum);
140 
141 // Returns a 32-bit hash for the given codec name.  See the VerifyUmaCodecHashes
142 // unit test for more information and code for generating the histogram XML.
143 MEDIA_EXPORT int32_t HashCodecName(const char* codec_name);
144 
145 }  // namespace media
146 
147 #endif  // MEDIA_FFMPEG_FFMPEG_COMMON_H_
148