mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 13:50:40 +01:00

This CL performs some cleanups on multiplex files: - Adds more comments to factory about usage. - Moves image packer outside /include as it doesn't need to be public. - Other small lint issues. Bug: webrtc:9632 Change-Id: I2e2e6929ea13645aee5483a3697199d1e6184b32 Reviewed-on: https://webrtc-review.googlesource.com/98700 Commit-Queue: Emircan Uysaler <emircan@webrtc.org> Reviewed-by: Niklas Enbom <niklas.enbom@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24615}
119 lines
4.4 KiB
C++
119 lines
4.4 KiB
C++
/*
|
|
* Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef MODULES_VIDEO_CODING_CODECS_MULTIPLEX_MULTIPLEX_ENCODED_IMAGE_PACKER_H_
|
|
#define MODULES_VIDEO_CODING_CODECS_MULTIPLEX_MULTIPLEX_ENCODED_IMAGE_PACKER_H_
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "common_types.h" // NOLINT(build/include)
|
|
#include "common_video/include/video_frame.h"
|
|
|
|
namespace webrtc {
|
|
|
|
// Struct describing the whole bundle of multiple frames of an image.
|
|
// This struct is expected to be the set in the beginning of a picture's
|
|
// bitstream data.
|
|
struct MultiplexImageHeader {
|
|
// The number of frame components making up the complete picture data.
|
|
// For example, |frame_count| = 2 for the case of YUV frame with Alpha frame.
|
|
uint8_t component_count;
|
|
|
|
// The increasing image ID given by the encoder. For different components
|
|
// of a single picture, they have the same |picture_index|.
|
|
uint16_t image_index;
|
|
|
|
// The location of the first MultiplexImageComponentHeader in the bitstream,
|
|
// in terms of byte from the beginning of the bitstream.
|
|
uint32_t first_component_header_offset;
|
|
|
|
// The location of the augmenting data in the bitstream, in terms of bytes
|
|
// from the beginning of the bitstream
|
|
uint32_t augmenting_data_offset;
|
|
|
|
// The size of the augmenting data in the bitstream it terms of byte
|
|
uint16_t augmenting_data_size;
|
|
};
|
|
const int kMultiplexImageHeaderSize =
|
|
sizeof(uint8_t) + 2 * sizeof(uint16_t) + 2 * sizeof(uint32_t);
|
|
|
|
// Struct describing the individual image component's content.
|
|
struct MultiplexImageComponentHeader {
|
|
// The location of the next MultiplexImageComponentHeader in the bitstream,
|
|
// in terms of the byte from the beginning of the bitstream;
|
|
uint32_t next_component_header_offset;
|
|
|
|
// Identifies which component this frame represent, i.e. YUV frame vs Alpha
|
|
// frame.
|
|
uint8_t component_index;
|
|
|
|
// The location of the real encoded image data of the frame in the bitstream,
|
|
// in terms of byte from the beginning of the bitstream.
|
|
uint32_t bitstream_offset;
|
|
|
|
// Indicates the number of bytes of the encoded image data.
|
|
uint32_t bitstream_length;
|
|
|
|
// Indicated the underlying VideoCodecType of the frame, i.e. VP9 or VP8 etc.
|
|
VideoCodecType codec_type;
|
|
|
|
// Indicated the underlying frame is a key frame or delta frame.
|
|
FrameType frame_type;
|
|
};
|
|
const int kMultiplexImageComponentHeaderSize =
|
|
sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint32_t) +
|
|
sizeof(uint8_t) + sizeof(uint8_t);
|
|
|
|
// Struct holding the encoded image for one component.
|
|
struct MultiplexImageComponent {
|
|
// Indicated the underlying VideoCodecType of the frame, i.e. VP9 or VP8 etc.
|
|
VideoCodecType codec_type;
|
|
|
|
// Identifies which component this frame represent, i.e. YUV frame vs Alpha
|
|
// frame.
|
|
uint8_t component_index;
|
|
|
|
// Stores the actual frame data of the encoded image.
|
|
EncodedImage encoded_image;
|
|
};
|
|
|
|
// Struct holding the whole frame bundle of components of an image.
|
|
struct MultiplexImage {
|
|
uint16_t image_index;
|
|
uint8_t component_count;
|
|
uint16_t augmenting_data_size;
|
|
std::unique_ptr<uint8_t[]> augmenting_data;
|
|
std::vector<MultiplexImageComponent> image_components;
|
|
|
|
MultiplexImage(uint16_t picture_index,
|
|
uint8_t component_count,
|
|
std::unique_ptr<uint8_t[]> augmenting_data,
|
|
uint16_t augmenting_data_size);
|
|
};
|
|
|
|
// A utility class providing conversion between two representations of a
|
|
// multiplex image frame:
|
|
// 1. Packed version is just one encoded image, we pack all necessary metadata
|
|
// in the bitstream as headers.
|
|
// 2. Unpacked version is essentially a list of encoded images, one for one
|
|
// component.
|
|
class MultiplexEncodedImagePacker {
|
|
public:
|
|
// Note: It is caller responsibility to release the buffer of the result.
|
|
static EncodedImage PackAndRelease(const MultiplexImage& image);
|
|
|
|
// Note: The image components just share the memory with |combined_image|.
|
|
static MultiplexImage Unpack(const EncodedImage& combined_image);
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_VIDEO_CODING_CODECS_MULTIPLEX_MULTIPLEX_ENCODED_IMAGE_PACKER_H_
|