1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
/*****************************************************************
* gmerlin-avdecoder - a general purpose multimedia decoding library
*
* Copyright (c) 2001 - 2024 Members of the Gmerlin project
* http://github.com/bplaum
*
* 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, either version 2 of the License, or
* (at your option) any later version.
*
* 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, see <http://www.gnu.org/licenses/>.
* *****************************************************************/
#ifndef BGAV_PARSER_H_INCLUDED
#define BGAV_PARSER_H_INCLUDED
#include <gavl/connectors.h>
/* Packet parser */
#define PARSER_HAS_SYNC (1<<0)
#define PARSER_HAS_HEADER (1<<1)
typedef struct
{
int64_t pts; // PTS of packet
int64_t position; // Position in the stream
int64_t size; // Is decreased by bgav_packet_parser_flush
} packet_info_t;
struct bgav_packet_parser_s
{
gavl_dictionary_t * info;
gavl_dictionary_t * m;
int packet_timescale;
gavl_buffer_t buf;
int fourcc;
int stream_id;
packet_info_t * packets;
int num_packets;
int packets_alloc;
gavl_packet_sink_t * next;
gavl_packet_sink_t * sink;
gavl_audio_format_t * afmt;
gavl_video_format_t * vfmt;
gavl_compression_info_t * ci;
gavl_packet_t in_packet;
int stream_flags;
int parser_flags;
int64_t raw_position;
/* Format specific */
void * priv;
void (*cleanup)(struct bgav_packet_parser_s *);
void (*reset)(struct bgav_packet_parser_s *);
/* Find the boundary of a frame.
if found: set buf.pos to the frame start, set *skip to the bytes after pos, where
we scan for the next frame boundary
if not found: set buf.pos to the position, where we can re-start the scan
*/
int (*find_frame_boundary)(struct bgav_packet_parser_s *, int * skip);
/*
*
*/
int (*parse_frame)(struct bgav_packet_parser_s *, gavl_packet_t * pkt);
};
gavl_packet_sink_t * bgav_packet_parser_connect(bgav_packet_parser_t * p, gavl_packet_sink_t * dst);
bgav_packet_parser_t * bgav_packet_parser_create(gavl_dictionary_t * stream_info, int stream_flags,
gavl_compression_info_t * ci);
void bgav_packet_parser_destroy(bgav_packet_parser_t * p);
/* Signal EOF, might send some more packets */
void bgav_packet_parser_flush(bgav_packet_parser_t * p);
/* Call after seeking */
void bgav_packet_parser_reset(bgav_packet_parser_t * p);
/* Initialization functions */
void bgav_packet_parser_init_mpeg(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_a52(bgav_packet_parser_t * parser);
#ifdef HAVE_FAAD2
void bgav_packet_parser_init_aac(bgav_packet_parser_t * parser);
#endif
#ifdef HAVE_DCA
void bgav_packet_parser_init_dca(bgav_packet_parser_t * parser);
#endif
#ifdef HAVE_SPEEX
void bgav_packet_parser_init_speex(bgav_packet_parser_t * parser);
#endif
#ifdef HAVE_VORBIS
void bgav_packet_parser_init_vorbis(bgav_packet_parser_t * parser);
#endif
#ifdef HAVE_THEORADEC
void bgav_packet_parser_init_theora(bgav_packet_parser_t * parser);
#endif
#ifdef HAVE_OPUS
void bgav_packet_parser_init_opus(bgav_packet_parser_t * parser);
#endif
void bgav_packet_parser_init_adts(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_flac(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_mpeg12(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_h264(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_mpeg4(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_cavs(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_vc1(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_dirac(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_mjpa(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_dv(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_jpeg(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_png(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_dvdsub(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_vp8(bgav_packet_parser_t * parser);
void bgav_packet_parser_init_vp9(bgav_packet_parser_t * parser);
#endif // BGAV_PARSER_H_INCLUDED
|