blob: f89ac8c4f01103f2f5163b505020073d2249ac2c [file] [log] [blame]
// Copyright 2020 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_H264_ANNEX_B_TO_AVC_BITSTREAM_CONVERTER_H_
#define MEDIA_FORMATS_MP4_H264_ANNEX_B_TO_AVC_BITSTREAM_CONVERTER_H_
#include <stdint.h>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/containers/span.h"
#include "base/macros.h"
#include "media/base/media_export.h"
#include "media/base/status.h"
#include "media/formats/mp4/box_definitions.h"
#include "media/video/h264_parser.h"
namespace media {
// H264AnnexBToAvcBitstreamConverter is a class to convert H.264 bitstream from
// Annex B (ISO/IEC 14496-10) to AVC (as specified in ISO/IEC 14496-15).
class MEDIA_EXPORT H264AnnexBToAvcBitstreamConverter {
public:
H264AnnexBToAvcBitstreamConverter();
~H264AnnexBToAvcBitstreamConverter();
// Converts a video chunk from a format with in-place decoder configuration
// into a format where configuration needs to be sent separately.
//
// |input| - where to read the data from
// |output| - where to put the converted video data
// If error kH264BufferTooSmall is returned, it means that |output| was not
// big enough to contain a converted video chunk. In this case |size_out|
// is populated.
// |config_changed_out| is set to True if the video chunk
// processed by this call contained decoder configuration information.
// In this case latest configuration information can be obtained
// from GetCurrentConfig().
// |size_out| - number of bytes written to |output|, or desired size of
// |output| if it's too small.
Status ConvertChunk(base::span<const uint8_t> input,
base::span<uint8_t> output,
bool* config_changed_out,
size_t* size_out);
// Returns the latest version of decoder configuration, found in converted
// video chunks.
const mp4::AVCDecoderConfigurationRecord& GetCurrentConfig();
private:
H264Parser parser_;
mp4::AVCDecoderConfigurationRecord config_;
using blob = std::vector<uint8_t>;
base::flat_map<int, blob> id2sps_;
base::flat_map<int, blob> id2pps_;
int active_sps_id_ = -1;
int active_pps_id_ = -1;
DISALLOW_COPY_AND_ASSIGN(H264AnnexBToAvcBitstreamConverter);
};
} // namespace media
#endif // MEDIA_FORMATS_MP4_H264_ANNEX_B_TO_AVC_BITSTREAM_CONVERTER_H_