123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- /*
- * Copyright (c) 2013-2014 - Andre Roth <neolynx@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation version 2
- * of the License.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- *
- */
- #ifndef _MPEG_ES_H
- #define _MPEG_ES_H
- /**
- * @file mpeg_es.h
- * @ingroup dvb_table
- * @brief Provides the table parser for the MPEG-TS Elementary Stream
- * @copyright GNU General Public License version 2 (GPLv2)
- * @author Andre Roth
- *
- * @par Relevant specs
- * The table described herein is defined in ISO 13818-2
- *
- * @see
- * http://dvd.sourceforge.net/dvdinfo/mpeghdrs.html
- *
- * @par Bug Report
- * Please submit bug reports and patches to linux-media@vger.kernel.org
- */
- #include <stdint.h>
- #include <unistd.h> /* ssize_t */
- /**
- * @def DVB_MPEG_ES_PIC_START
- * @brief Picture Start
- * @ingroup dvb_table
- * @def DVB_MPEG_ES_USER_DATA
- * @brief User Data
- * @ingroup dvb_table
- * @def DVB_MPEG_ES_SEQ_START
- * @brief Sequence Start
- * @ingroup dvb_table
- * @def DVB_MPEG_ES_SEQ_EXT
- * @brief Extension
- * @ingroup dvb_table
- * @def DVB_MPEG_ES_GOP
- * @brief Group Of Pictures
- * @ingroup dvb_table
- * @def DVB_MPEG_ES_SLICES
- * @brief Slices
- * @ingroup dvb_table
- */
- #define DVB_MPEG_ES_PIC_START 0x00
- #define DVB_MPEG_ES_USER_DATA 0xb2
- #define DVB_MPEG_ES_SEQ_START 0xb3
- #define DVB_MPEG_ES_SEQ_EXT 0xb5
- #define DVB_MPEG_ES_GOP 0xb8
- #define DVB_MPEG_ES_SLICES 0x01 ... 0xaf
- /**
- * @struct dvb_mpeg_es_seq_start
- * @brief MPEG ES Sequence header
- * @ingroup dvb_table
- *
- * @param type DVB_MPEG_ES_SEQ_START
- * @param sync Sync bytes
- * @param framerate Framerate
- * @param aspect Aspect ratio
- * @param height Height
- * @param width Width
- * @param qm_nonintra Load non-intra quantizer matrix
- * @param qm_intra Load intra quantizer matrix
- * @param constrained Constrained parameters flag
- * @param vbv VBV buffer size
- * @param one Should be 1
- * @param bitrate Bitrate
- */
- struct dvb_mpeg_es_seq_start {
- union {
- uint32_t bitfield;
- struct {
- uint32_t type:8;
- uint32_t sync:24;
- } __attribute__((packed));
- } __attribute__((packed));
- union {
- uint32_t bitfield2;
- struct {
- uint32_t framerate:4;
- uint32_t aspect:4;
- uint32_t height:12;
- uint32_t width:12;
- } __attribute__((packed));
- } __attribute__((packed));
- union {
- uint32_t bitfield3;
- struct {
- uint32_t qm_nonintra:1;
- uint32_t qm_intra:1;
- uint32_t constrained:1;
- uint32_t vbv:10; // Size of video buffer verifier = 16*1024*vbv buf size
- uint32_t one:1;
- uint32_t bitrate:18;
- } __attribute__((packed));
- } __attribute__((packed));
- } __attribute__((packed));
- /**
- * @struct dvb_mpeg_es_pic_start
- * @brief MPEG ES Picture start header
- * @ingroup dvb_table
- *
- * @param type DVB_MPEG_ES_PIC_START
- * @param sync Sync bytes
- * @param dummy Unused
- * @param vbv_delay VBV delay
- * @param coding_type Frame type (enum dvb_mpeg_es_frame_t)
- * @param temporal_ref Temporal sequence number
- */
- struct dvb_mpeg_es_pic_start {
- union {
- uint32_t bitfield;
- struct {
- uint32_t type:8;
- uint32_t sync:24;
- } __attribute__((packed));
- } __attribute__((packed));
- union {
- uint32_t bitfield2;
- struct {
- uint32_t dummy:3;
- uint32_t vbv_delay:16;
- uint32_t coding_type:3;
- uint32_t temporal_ref:10;
- } __attribute__((packed));
- } __attribute__((packed));
- } __attribute__((packed));
- /**
- * @enum dvb_mpeg_es_frame_t
- * @brief MPEG frame types
- * @ingroup dvb_table
- *
- * @var DVB_MPEG_ES_FRAME_UNKNOWN
- * @brief Unknown frame
- * @var DVB_MPEG_ES_FRAME_I
- * @brief I frame
- * @var DVB_MPEG_ES_FRAME_P
- * @brief P frame
- * @var DVB_MPEG_ES_FRAME_B
- * @brief B frame
- * @var DVB_MPEG_ES_FRAME_D
- * @brief D frame
- */
- enum dvb_mpeg_es_frame_t
- {
- DVB_MPEG_ES_FRAME_UNKNOWN,
- DVB_MPEG_ES_FRAME_I,
- DVB_MPEG_ES_FRAME_P,
- DVB_MPEG_ES_FRAME_B,
- DVB_MPEG_ES_FRAME_D
- };
- /**
- * @brief Vector that translates from enum dvb_mpeg_es_frame_t to string.
- * @ingroup dvb_table
- */
- extern const char *dvb_mpeg_es_frame_names[5];
- struct dvb_v5_fe_parms;
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * @brief Initialize a struct dvb_mpeg_es_seq_start from buffer
- * @ingroup dvb_table
- *
- * @param buf Buffer
- * @param buflen Length of buffer
- * @param seq_start Pointer to allocated struct dvb_mpeg_es_seq_start
- *
- * @return If buflen too small, return -1, 0 otherwise.
- *
- * This function copies the length of struct dvb_mpeg_es_seq_start
- * to seq_start and fixes endianness. seq_start has to be allocated
- * with malloc.
- */
- int dvb_mpeg_es_seq_start_init (const uint8_t *buf, ssize_t buflen,
- struct dvb_mpeg_es_seq_start *seq_start);
- /**
- * @brief Print details of struct dvb_mpeg_es_seq_start
- * @ingroup dvb_table
- *
- * @param parms struct dvb_v5_fe_parms for log functions
- * @param seq_start Pointer to struct dvb_mpeg_es_seq_start to print
- *
- * This function prints the fields of struct dvb_mpeg_es_seq_start
- */
- void dvb_mpeg_es_seq_start_print(struct dvb_v5_fe_parms *parms,
- struct dvb_mpeg_es_seq_start *seq_start);
- /**
- * @brief Initialize a struct dvb_mpeg_es_pic_start from buffer
- * @ingroup dvb_table
- *
- * @param buf Buffer
- * @param buflen Length of buffer
- * @param pic_start Pointer to allocated structdvb_mpeg_es_pic_start
- *
- * @return If buflen too small, return -1, 0 otherwise.
- *
- * This function copies the length of struct dvb_mpeg_es_pic_start
- * to pic_start and fixes endianness. seq_start has to be allocated
- * with malloc.
- */
- int dvb_mpeg_es_pic_start_init (const uint8_t *buf, ssize_t buflen,
- struct dvb_mpeg_es_pic_start *pic_start);
- /**
- * @brief Print details of struct dvb_mpeg_es_pic_start
- * @ingroup dvb_table
- *
- * @param parms struct dvb_v5_fe_parms for log functions
- * @param pic_start Pointer to struct dvb_mpeg_es_pic_start to print
- *
- * This function prints the fields of struct dvb_mpeg_es_pic_start
- */
- void dvb_mpeg_es_pic_start_print(struct dvb_v5_fe_parms *parms,
- struct dvb_mpeg_es_pic_start *pic_start);
- #ifdef __cplusplus
- }
- #endif
- #endif
|