File: parser.h

package info (click to toggle)
gmerlin-avdecoder 2.0.0%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,432 kB
  • sloc: ansic: 89,363; sh: 667; makefile: 650; awk: 43; sed: 16
file content (156 lines) | stat: -rw-r--r-- 4,660 bytes parent folder | download
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