blob: 4b9677131ccf2072efe82a46545aca4e3189c20c [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_FORMATS_MP4_BITSTREAM_CONVERTER_H_
#define MEDIA_FORMATS_MP4_BITSTREAM_CONVERTER_H_
#include <stdint.h>
#include <vector>
#include "base/memory/ref_counted.h"
#include "media/base/media_export.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace media {
struct SubsampleEntry;
namespace mp4 {
// BitstreamConverter provides a unified interface for performing some common
// bitstream conversions (e.g. H.264 MP4 bitstream to Annex B, and elementary
// AAC stream to ADTS).
class MEDIA_EXPORT BitstreamConverter
: public base::RefCountedThreadSafe<BitstreamConverter> {
public:
// Describes the result of Analyze(). Not all analyses are implemented or
// enabled across mp4::BitstreamConverter implementations, hence the use of
// absl::optional<>.
struct MEDIA_EXPORT AnalysisResult {
AnalysisResult();
AnalysisResult(const AnalysisResult&);
~AnalysisResult();
absl::optional<bool> is_conformant;
absl::optional<bool> is_keyframe;
};
// Converts a single frame/buffer |frame_buf| into the output format.
// Returns true iff the conversion was successful.
// |frame_buf| is an input/output parameter, it contains input frame data and
// contains converted output data if conversion was successful.
// |is_keyframe| indicates whether it's a key frame or not.
// |subsamples| is an input/output parameter that contains CENC subsample
// information. The conversion code should |subsamples| to determine if parts
// of input frame are encrypted and should update |subsamples| if necessary,
// to make sure it correctly describes the converted output frame. See
// SubsampleEntry definition in media/base/decrypt_config.h for more info.
// |analysis_result| is an output parameter that contains the AnalysisResult
// found during conversion.
virtual bool ConvertAndAnalyzeFrame(
std::vector<uint8_t>* frame_buf,
bool is_keyframe,
std::vector<SubsampleEntry>* subsamples,
AnalysisResult* analysis_result) const = 0;
protected:
friend class base::RefCountedThreadSafe<BitstreamConverter>;
virtual ~BitstreamConverter();
// Inspects an already converted frame for conformance. If conformant,
// inspects further to see if the converted frame appears to be a keyframe.
// Note, the checks may not be exhaustive (or implemented at all).
virtual AnalysisResult Analyze(
std::vector<uint8_t>* frame_buf,
std::vector<SubsampleEntry>* subsamples) const = 0;
};
} // namespace mp4
} // namespace media
#endif // MEDIA_FORMATS_MP4_BITSTREAM_CONVERTER_H_