/*!
* COPYRIGHT (C) 2020 Emeric Grange - All Rights Reserved
*
* This file is part of MiniVideo.
*
* MiniVideo is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MiniVideo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with MiniVideo. If not, see .
*
* \file pes_struct.h
* \author Emeric Grange
* \date 2012
*/
#ifndef PARSER_MPEG_PES_STRUCT_H
#define PARSER_MPEG_PES_STRUCT_H
// minivideo headers
#include
/* ************************************************************************** */
/*!
* \struct PesHeader_t
* \brief PES packet header structure.
*
* From 'ISO/IEC 13818-1' specification:
* Table 2-17 – PES packet.
*/
typedef struct PesHeader_t
{
int64_t offset_start; //!< Absolute position of the very first byte of this PES (including start code)
int64_t offset_end; //!< Absolute position of the last byte of this PES
uint32_t start_code; //!< should be 0x000001
uint8_t stream_id;
uint32_t packet_length; //!< Full packet length
uint32_t payload_length; //!< Payload length only
} PesHeader_t;
/*!
* \struct PesPacket_t
* \brief PES packet structure.
*
* From 'ISO/IEC 13818-1' specification:
* Table 2-17 – PES packet.
*/
typedef struct PesPacket_t
{
uint32_t mpeg_version;
// "Regular" PES parameters
uint8_t PES_scrambling_control;
uint8_t PES_priority;
uint8_t data_alignment_indicator;
uint8_t copyright;
uint8_t original_or_copy;
uint8_t PTS_DTS_flag;
uint8_t ESCR_flag;
uint8_t ES_rate_flag;
uint8_t DSM_trick_mode_flag;
uint8_t additional_copy_info_flag;
uint8_t PES_CRC_flag;
uint8_t PES_extension_flag;
uint8_t PES_header_data_length;
uint64_t PTS;
uint64_t DTS;
uint64_t ESCR_base;
uint16_t ESCR_extension;
uint32_t ES_rate;
// Trick mode
uint8_t trick_mode_control;
uint8_t field_id;
uint8_t intra_slice_refresh;
uint8_t frequency_truncation;
uint8_t rep_cntrl;
// Additional_copy_info_flag
uint8_t additional_copy_info;
// PES_CRC_flag
uint16_t previous_PES_packet_CRC;
// PES_extension_flag
uint8_t PES_private_data_flag;
uint8_t pack_header_field_flag;
uint8_t program_packet_sequence_counter_flag;
uint8_t PSTD_buffer_flag;
uint8_t PES_extension_flag_2;
// PES_private_data_flag
uint8_t PES_private_data[16];
// pack_header_field_flag
uint8_t pack_field_length;
// program_packet_sequence_counter_flag
uint8_t program_packet_sequence_counter;
uint8_t MPEG1_MPEG2_identifier;
uint8_t original_stuff_length;
// PSTD_buffer_flag
uint8_t PSTD_buffer_scale;
uint16_t PSTD_buffer_size;
// PES_extension_flag_2
uint8_t PES_extension_field_length;
} PesPacket_t;
/* ************************************************************************** */
/*!
* \enum trickMode_e
* \brief Can modify stream speed.
*
* H.222 / table 2-20.
*/
typedef enum trickMode_e
{
TM_FAST_FORWARD = 0x0,
TM_SLOW_MOTION = 0x1,
TM_FREEZE_FRAME = 0x2,
TM_FAST_REVERSE = 0x3,
TM_SLOW_REVERSE = 0x4
} trickMode_e;
/*!
* \enum fieldId_e
* \brief Indicate which field(s) should be displayed.
*
* H.222 / table 2-21.
*/
typedef enum fieldId_e
{
FID_TOP = 0x0,
FID_BOTTOM = 0x1,
FID_FRAME = 0x2,
FID_RESERVED = 0x3
} fieldId_e;
/*!
* \enum PesStreamId_e
* \brief Specify the type of Packetized Elementary Stream.
*
* 8b stream_id only.
* H.222 / table 2-18.
*/
typedef enum PesStreamId_e
{
SID_PROGRAM_END = 0xB9,
SID_PACK_HEADER = 0xBA,
SID_SYSTEM_HEADER = 0xBB,
SID_PROGRAM_STREAM_MAP = 0xBC,
SID_PRIVATE_STREAM_1 = 0xBD,
SID_PADDING = 0xBE,
SID_PRIVATE_STREAM_2 = 0xBF,
SID_AUDIO = 0xC0, //!< audio: C0 to DF
SID_VIDEO = 0xE0, //!< video: E0 to EF
SID_ECM_STREAM = 0xF0,
SID_EMM_STREAM = 0xF1,
SID_DSMCC_STREAM = 0xF2,
SID_CEI13522_STREAM = 0xF3,
SID_2221A = 0xF4,
SID_2221B = 0xF5,
SID_2221C = 0xF6,
SID_2221D = 0xF7,
SID_2221E = 0xF8,
SID_ANC_DATA = 0xF9,
SID_SLPACKETIZED_STREAM = 0xFA,
SID_FLEXMUX_STREAM = 0xFB,
SID_RESERVED = 0xFC, //!< reserved: FC to FE
SID_PROGRAM_STREAM_DIRECTORY = 0xFF
} PesStreamId_e;
/* ************************************************************************** */
#endif // PARSER_MPEG_PES_STRUCT_H