| Index: media/ffmpeg/ffmpeg_common.cc
|
| diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
|
| index 8b75f4fc13eafcbbdcc4ab80aea264508a9cf404..2e0ca65d401895e47fb19a1e94905f49e86d0af1 100644
|
| --- a/media/ffmpeg/ffmpeg_common.cc
|
| +++ b/media/ffmpeg/ffmpeg_common.cc
|
| @@ -405,10 +405,27 @@ bool AVCodecContextToAudioDecoderConfig(
|
| return true;
|
| }
|
|
|
| +std::unique_ptr<AVCodecContext, ScopedPtrAVFreeContext>
|
| +AVStreamToAVCodecContext(const AVStream* stream) {
|
| + std::unique_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context(
|
| + avcodec_alloc_context3(nullptr));
|
| + if (avcodec_parameters_to_context(codec_context.get(), stream->codecpar) <
|
| + 0) {
|
| + return nullptr;
|
| + }
|
| +
|
| + return codec_context;
|
| +}
|
| +
|
| bool AVStreamToAudioDecoderConfig(const AVStream* stream,
|
| AudioDecoderConfig* config) {
|
| + std::unique_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context(
|
| + AVStreamToAVCodecContext(stream));
|
| + if (!codec_context)
|
| + return false;
|
| +
|
| return AVCodecContextToAudioDecoderConfig(
|
| - stream->codec, GetEncryptionScheme(stream), config);
|
| + codec_context.get(), GetEncryptionScheme(stream), config);
|
| }
|
|
|
| void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
|
| @@ -441,22 +458,26 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
|
|
|
| bool AVStreamToVideoDecoderConfig(const AVStream* stream,
|
| VideoDecoderConfig* config) {
|
| - // Anticipating AVStream.codec.coded_{width,height} will be inaccessible in
|
| - // ffmpeg soon, just use the width and height, padded below, as hints of the
|
| - // coded size.
|
| - gfx::Size coded_size(stream->codec->width, stream->codec->height);
|
| + std::unique_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context(
|
| + AVStreamToAVCodecContext(stream));
|
| + if (!codec_context)
|
| + return false;
|
| +
|
| + // AVStream.codec->coded_{width,height} access is deprecated in ffmpeg.
|
| + // Use just the width and height as hints of coded size.
|
| + gfx::Size coded_size(codec_context->width, codec_context->height);
|
|
|
| // TODO(vrk): This assumes decoded frame data starts at (0, 0), which is true
|
| // for now, but may not always be true forever. Fix this in the future.
|
| - gfx::Rect visible_rect(stream->codec->width, stream->codec->height);
|
| + gfx::Rect visible_rect(codec_context->width, codec_context->height);
|
|
|
| AVRational aspect_ratio = { 1, 1 };
|
| if (stream->sample_aspect_ratio.num)
|
| aspect_ratio = stream->sample_aspect_ratio;
|
| - else if (stream->codec->sample_aspect_ratio.num)
|
| - aspect_ratio = stream->codec->sample_aspect_ratio;
|
| + else if (codec_context->sample_aspect_ratio.num)
|
| + aspect_ratio = codec_context->sample_aspect_ratio;
|
|
|
| - VideoCodec codec = CodecIDToVideoCodec(stream->codec->codec_id);
|
| + VideoCodec codec = CodecIDToVideoCodec(codec_context->codec_id);
|
|
|
| VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN;
|
| if (codec == kCodecVP8)
|
| @@ -466,7 +487,7 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
|
| // crbug.com/592074
|
| profile = VP9PROFILE_PROFILE0;
|
| else
|
| - profile = ProfileIDToVideoCodecProfile(stream->codec->profile);
|
| + profile = ProfileIDToVideoCodecProfile(codec_context->profile);
|
|
|
| // Without the FFmpeg h264 decoder, AVFormat is unable to get the profile, so
|
| // default to baseline and let the VDA fail later if it doesn't support the
|
| @@ -481,7 +502,7 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
|
| visible_rect.size(), aspect_ratio.num, aspect_ratio.den);
|
|
|
| VideoPixelFormat format =
|
| - AVPixelFormatToVideoPixelFormat(stream->codec->pix_fmt);
|
| + AVPixelFormatToVideoPixelFormat(codec_context->pix_fmt);
|
| // The format and coded size may be unknown if FFmpeg is compiled without
|
| // video decoders.
|
| #if defined(DISABLE_FFMPEG_VIDEO_DECODERS)
|
| @@ -511,8 +532,8 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
|
| }
|
|
|
| // Prefer the color space found by libavcodec if available.
|
| - ColorSpace color_space = AVColorSpaceToColorSpace(stream->codec->colorspace,
|
| - stream->codec->color_range);
|
| + ColorSpace color_space = AVColorSpaceToColorSpace(codec_context->colorspace,
|
| + codec_context->color_range);
|
| if (color_space == COLOR_SPACE_UNSPECIFIED) {
|
| // Otherwise, assume that SD video is usually Rec.601, and HD is usually
|
| // Rec.709.
|
| @@ -520,20 +541,20 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
|
| : COLOR_SPACE_HD_REC709;
|
| }
|
|
|
| - // AVStream occasionally has invalid extra data. See http://crbug.com/517163
|
| - if ((stream->codec->extradata_size == 0) !=
|
| - (stream->codec->extradata == nullptr)) {
|
| - LOG(ERROR) << __func__
|
| - << (stream->codec->extradata == nullptr ? " NULL" : " Non-Null")
|
| - << " extra data cannot have size of "
|
| - << stream->codec->extradata_size << ".";
|
| + // AVCodecContext occasionally has invalid extra data. See
|
| + // http://crbug.com/517163
|
| + if (codec_context->extradata != nullptr &&
|
| + codec_context->extradata_size == 0) {
|
| + LOG(ERROR) << __func__ << " Non-Null extra data cannot have size of 0.";
|
| return false;
|
| }
|
| + CHECK_EQ(codec_context->extradata == nullptr,
|
| + codec_context->extradata_size == 0);
|
|
|
| std::vector<uint8_t> extra_data;
|
| - if (stream->codec->extradata_size > 0) {
|
| - extra_data.assign(stream->codec->extradata,
|
| - stream->codec->extradata + stream->codec->extradata_size);
|
| + if (codec_context->extradata_size > 0) {
|
| + extra_data.assign(codec_context->extradata,
|
| + codec_context->extradata + codec_context->extradata_size);
|
| }
|
| config->Initialize(codec, profile, format, color_space, coded_size,
|
| visible_rect, natural_size, extra_data,
|
| @@ -733,45 +754,6 @@ ColorSpace AVColorSpaceToColorSpace(AVColorSpace color_space,
|
| return COLOR_SPACE_UNSPECIFIED;
|
| }
|
|
|
| -bool FFmpegUTCDateToTime(const char* date_utc, base::Time* out) {
|
| - DCHECK(date_utc);
|
| - DCHECK(out);
|
| -
|
| - std::vector<base::StringPiece> fields = base::SplitStringPiece(
|
| - date_utc, " ", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
|
| - if (fields.size() != 2)
|
| - return false;
|
| -
|
| - std::vector<base::StringPiece> date_fields = base::SplitStringPiece(
|
| - fields[0], "-", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
|
| - if (date_fields.size() != 3)
|
| - return false;
|
| -
|
| - // TODO(acolwell): Update this parsing code when FFmpeg returns sub-second
|
| - // information.
|
| - std::vector<base::StringPiece> time_fields = base::SplitStringPiece(
|
| - fields[1], ":", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
|
| - if (time_fields.size() != 3)
|
| - return false;
|
| -
|
| - base::Time::Exploded exploded;
|
| - exploded.millisecond = 0;
|
| - // This field cannot be uninitialized. Unless not modified, make it 0 here
|
| - // then.
|
| - exploded.day_of_week = 0;
|
| - if (base::StringToInt(date_fields[0], &exploded.year) &&
|
| - base::StringToInt(date_fields[1], &exploded.month) &&
|
| - base::StringToInt(date_fields[2], &exploded.day_of_month) &&
|
| - base::StringToInt(time_fields[0], &exploded.hour) &&
|
| - base::StringToInt(time_fields[1], &exploded.minute) &&
|
| - base::StringToInt(time_fields[2], &exploded.second)) {
|
| - if (base::Time::FromUTCExploded(exploded, out))
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| int32_t HashCodecName(const char* codec_name) {
|
| // Use the first 32-bits from the SHA1 hash as the identifier.
|
| int32_t hash;
|
|
|