Mercurial > libavformat.hg
annotate mpegts.c @ 2771:d52c718e83f9 libavformat
Use dynamically allocated ByteIOContext in AVFormatContext
patch by: Bj?rn Axelsson, bjorn d axelsson a intinor d se
thread: [PATCH] Remove static ByteIOContexts, 06 nov 2007
| author | andoma |
|---|---|
| date | Wed, 21 Nov 2007 07:41:00 +0000 |
| parents | 5e808c3a55a8 |
| children | c31c50af40c5 |
| rev | line source |
|---|---|
| 0 | 1 /* |
|
1415
3b00fb8ef8e4
replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents:
1358
diff
changeset
|
2 * MPEG2 transport stream (aka DVB) demuxer |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
3 * Copyright (c) 2002-2003 Fabrice Bellard. |
| 0 | 4 * |
|
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1280
diff
changeset
|
5 * This file is part of FFmpeg. |
|
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1280
diff
changeset
|
6 * |
|
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1280
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
| 0 | 8 * modify it under the terms of the GNU Lesser General Public |
| 9 * License as published by the Free Software Foundation; either | |
|
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1280
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
| 0 | 11 * |
|
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1280
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
| 0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 15 * Lesser General Public License for more details. | |
| 16 * | |
| 17 * You should have received a copy of the GNU Lesser General Public | |
|
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1280
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
|
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
892
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 0 | 20 */ |
| 21 #include "avformat.h" | |
| 996 | 22 #include "crc.h" |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
23 #include "mpegts.h" |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
24 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
25 //#define DEBUG_SI |
| 310 | 26 //#define DEBUG_SEEK |
| 0 | 27 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
28 /* 1.0 second at 24Mbit/s */ |
|
170
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
29 #define MAX_SCAN_PACKETS 32000 |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
30 |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
31 /* maximum size in which we look for synchronisation if |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
32 synchronisation is lost */ |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
33 #define MAX_RESYNC_SIZE 4096 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
34 |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
35 typedef struct PESContext PESContext; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
36 |
|
2157
0103a8479df5
proper per stream pcr_pid support by (Wolfram Gloger wmglo dent.med.uni-muenchen@de )
michael
parents:
2146
diff
changeset
|
37 static PESContext* add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid, int stream_type); |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
38 static AVStream* new_pes_av_stream(PESContext *pes, uint32_t code); |
|
2574
9e51e62f5bdd
replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents:
2555
diff
changeset
|
39 extern void av_set_program_name(AVProgram *program, char *provider_name, char *name); |
|
2651
38639f62f23f
associate to each AVProgram the indexes of the AVStreams contained in it
nicodvb
parents:
2575
diff
changeset
|
40 extern void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
41 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
42 enum MpegTSFilterType { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
43 MPEGTS_PES, |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
44 MPEGTS_SECTION, |
| 0 | 45 }; |
| 46 | |
|
2236
117edddfce20
update SectionCallback and PESCallback typedefs to match functions
mru
parents:
2222
diff
changeset
|
47 typedef struct MpegTSFilter MpegTSFilter; |
|
117edddfce20
update SectionCallback and PESCallback typedefs to match functions
mru
parents:
2222
diff
changeset
|
48 |
|
117edddfce20
update SectionCallback and PESCallback typedefs to match functions
mru
parents:
2222
diff
changeset
|
49 typedef void PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
50 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
51 typedef struct MpegTSPESFilter { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
52 PESCallback *pes_cb; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
53 void *opaque; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
54 } MpegTSPESFilter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
55 |
|
2236
117edddfce20
update SectionCallback and PESCallback typedefs to match functions
mru
parents:
2222
diff
changeset
|
56 typedef void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
57 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
58 typedef void SetServiceCallback(void *opaque, int ret); |
| 0 | 59 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
60 typedef struct MpegTSSectionFilter { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
61 int section_index; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
62 int section_h_size; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
63 uint8_t *section_buf; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
64 int check_crc:1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
65 int end_of_section_reached:1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
66 SectionCallback *section_cb; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
67 void *opaque; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
68 } MpegTSSectionFilter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
69 |
|
2236
117edddfce20
update SectionCallback and PESCallback typedefs to match functions
mru
parents:
2222
diff
changeset
|
70 struct MpegTSFilter { |
| 0 | 71 int pid; |
| 72 int last_cc; /* last cc code (-1 if first packet) */ | |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
73 enum MpegTSFilterType type; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
74 union { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
75 MpegTSPESFilter pes_filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
76 MpegTSSectionFilter section_filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
77 } u; |
|
2236
117edddfce20
update SectionCallback and PESCallback typedefs to match functions
mru
parents:
2222
diff
changeset
|
78 }; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
79 |
|
2575
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
80 #define MAX_PIDS_PER_PROGRAM 64 |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
81 typedef struct { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
82 unsigned int id; //program id/service id |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
83 unsigned int nb_pids; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
84 unsigned int pids[MAX_PIDS_PER_PROGRAM]; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
85 } Program_t; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
86 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
87 struct MpegTSContext { |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
88 /* user data */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
89 AVFormatContext *stream; |
|
1726
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
90 /** raw packet size, including FEC if present */ |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
91 int raw_packet_size; |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
92 /** if true, all pids are analyzed to find streams */ |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
93 int auto_guess; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
94 |
|
1726
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
95 /** compute exact PCR for each transport stream packet */ |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
96 int mpeg2ts_compute_pcr; |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
97 |
|
1726
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
98 int64_t cur_pcr; /**< used to estimate the exact PCR */ |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
99 int pcr_incr; /**< used to estimate the exact PCR */ |
| 885 | 100 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
101 /* data needed to handle file based ts */ |
|
1726
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
102 /** stop parsing loop */ |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
103 int stop_parse; |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
104 /** packet containing Audio/Video data */ |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
105 AVPacket *pkt; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
106 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
107 /******************************************/ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
108 /* private mpegts data */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
109 /* scan context */ |
|
2575
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
110 /** structure to keep track of Program->pids mapping */ |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
111 unsigned int nb_prg; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
112 Program_t *prg; |
| 885 | 113 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
114 |
|
1726
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
115 /** filters for various streams specified by PMT + for the PAT and PMT */ |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
116 MpegTSFilter *pids[NB_PID_MAX]; |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
117 }; |
| 0 | 118 |
|
2133
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
119 /* TS stream handling */ |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
120 |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
121 enum MpegTSState { |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
122 MPEGTS_HEADER = 0, |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
123 MPEGTS_PESHEADER_FILL, |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
124 MPEGTS_PAYLOAD, |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
125 MPEGTS_SKIP, |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
126 }; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
127 |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
128 /* enough for PES header + length */ |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
129 #define PES_START_SIZE 9 |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
130 #define MAX_PES_HEADER_SIZE (9 + 255) |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
131 |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
132 struct PESContext { |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
133 int pid; |
|
2157
0103a8479df5
proper per stream pcr_pid support by (Wolfram Gloger wmglo dent.med.uni-muenchen@de )
michael
parents:
2146
diff
changeset
|
134 int pcr_pid; /**< if -1 then all packets containing PCR are considered */ |
|
2133
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
135 int stream_type; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
136 MpegTSContext *ts; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
137 AVFormatContext *stream; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
138 AVStream *st; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
139 enum MpegTSState state; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
140 /* used to get the format */ |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
141 int data_index; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
142 int total_size; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
143 int pes_header_size; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
144 int64_t pts, dts; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
145 uint8_t header[MAX_PES_HEADER_SIZE]; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
146 }; |
|
2b2f5fc314e0
move structs and enums to top of file so they can be used
michael
parents:
2132
diff
changeset
|
147 |
| 2555 | 148 extern AVInputFormat mpegts_demuxer; |
| 149 | |
|
2575
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
150 static void clear_program(MpegTSContext *ts, unsigned int programid) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
151 { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
152 int i; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
153 |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
154 for(i=0; i<ts->nb_prg; i++) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
155 if(ts->prg[i].id == programid) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
156 ts->prg[i].nb_pids = 0; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
157 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
158 |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
159 static void clear_programs(MpegTSContext *ts) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
160 { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
161 av_freep(&ts->prg); |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
162 ts->nb_prg=0; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
163 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
164 |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
165 static void add_pat_entry(MpegTSContext *ts, unsigned int programid) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
166 { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
167 Program_t *p; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
168 void *tmp = av_realloc(ts->prg, (ts->nb_prg+1)*sizeof(Program_t)); |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
169 if(!tmp) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
170 return; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
171 ts->prg = tmp; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
172 p = &ts->prg[ts->nb_prg]; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
173 p->id = programid; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
174 p->nb_pids = 0; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
175 ts->nb_prg++; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
176 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
177 |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
178 static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
179 { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
180 int i; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
181 Program_t *p = NULL; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
182 for(i=0; i<ts->nb_prg; i++) { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
183 if(ts->prg[i].id == programid) { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
184 p = &ts->prg[i]; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
185 break; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
186 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
187 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
188 if(!p) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
189 return; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
190 |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
191 if(p->nb_pids >= MAX_PIDS_PER_PROGRAM) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
192 return; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
193 p->pids[p->nb_pids++] = pid; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
194 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
195 |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
196 /** |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
197 * \brief discard_pid() decides if the pid is to be discarded according |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
198 * to caller's programs selection |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
199 * \param ts : - TS context |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
200 * \param pid : - pid |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
201 * \return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
202 * 0 otherwise |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
203 */ |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
204 static int discard_pid(MpegTSContext *ts, unsigned int pid) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
205 { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
206 int i, j, k; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
207 int used = 0, discarded = 0; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
208 Program_t *p; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
209 for(i=0; i<ts->nb_prg; i++) { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
210 p = &ts->prg[i]; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
211 for(j=0; j<p->nb_pids; j++) { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
212 if(p->pids[j] != pid) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
213 continue; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
214 //is program with id p->id set to be discarded? |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
215 for(k=0; k<ts->stream->nb_programs; k++) { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
216 if(ts->stream->programs[k]->id == p->id) { |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
217 if(ts->stream->programs[k]->discard == AVDISCARD_ALL) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
218 discarded++; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
219 else |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
220 used++; |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
221 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
222 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
223 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
224 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
225 |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
226 return (!used && discarded); |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
227 } |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
228 |
|
1726
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
229 /** |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
230 * Assembles PES packets out of TS packets, and then calls the "section_cb" |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
231 * function when they are complete. |
|
63bb140936c0
mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1724
diff
changeset
|
232 */ |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
233 static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1, |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
234 const uint8_t *buf, int buf_size, int is_start) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
235 { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
236 MpegTSSectionFilter *tss = &tss1->u.section_filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
237 int len; |
| 885 | 238 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
239 if (is_start) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
240 memcpy(tss->section_buf, buf, buf_size); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
241 tss->section_index = buf_size; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
242 tss->section_h_size = -1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
243 tss->end_of_section_reached = 0; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
244 } else { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
245 if (tss->end_of_section_reached) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
246 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
247 len = 4096 - tss->section_index; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
248 if (buf_size < len) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
249 len = buf_size; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
250 memcpy(tss->section_buf + tss->section_index, buf, len); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
251 tss->section_index += len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
252 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
253 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
254 /* compute section length if possible */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
255 if (tss->section_h_size == -1 && tss->section_index >= 3) { |
| 2222 | 256 len = (AV_RB16(tss->section_buf + 1) & 0xfff) + 3; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
257 if (len > 4096) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
258 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
259 tss->section_h_size = len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
260 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
261 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
262 if (tss->section_h_size != -1 && tss->section_index >= tss->section_h_size) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
263 tss->end_of_section_reached = 1; |
|
675
29a19aec26b2
Writing to freed memory in write_section_data() patch by (Wolfram Gloger <wmglo dent dot med dot uni-muenchen de>)
michael
parents:
555
diff
changeset
|
264 if (!tss->check_crc || |
| 996 | 265 av_crc(av_crc04C11DB7, -1, tss->section_buf, tss->section_h_size) == 0) |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
266 tss->section_cb(tss1, tss->section_buf, tss->section_h_size); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
267 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
268 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
269 |
|
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
1047
diff
changeset
|
270 static MpegTSFilter *mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
271 SectionCallback *section_cb, void *opaque, |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
272 int check_crc) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
273 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
274 { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
275 MpegTSFilter *filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
276 MpegTSSectionFilter *sec; |
| 885 | 277 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
278 #ifdef DEBUG_SI |
| 1748 | 279 av_log(ts->stream, AV_LOG_DEBUG, "Filter: pid=0x%x\n", pid); |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
280 #endif |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
281 if (pid >= NB_PID_MAX || ts->pids[pid]) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
282 return NULL; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
283 filter = av_mallocz(sizeof(MpegTSFilter)); |
| 885 | 284 if (!filter) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
285 return NULL; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
286 ts->pids[pid] = filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
287 filter->type = MPEGTS_SECTION; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
288 filter->pid = pid; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
289 filter->last_cc = -1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
290 sec = &filter->u.section_filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
291 sec->section_cb = section_cb; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
292 sec->opaque = opaque; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
293 sec->section_buf = av_malloc(MAX_SECTION_SIZE); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
294 sec->check_crc = check_crc; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
295 if (!sec->section_buf) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
296 av_free(filter); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
297 return NULL; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
298 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
299 return filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
300 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
301 |
|
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
1047
diff
changeset
|
302 static MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
303 PESCallback *pes_cb, |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
304 void *opaque) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
305 { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
306 MpegTSFilter *filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
307 MpegTSPESFilter *pes; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
308 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
309 if (pid >= NB_PID_MAX || ts->pids[pid]) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
310 return NULL; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
311 filter = av_mallocz(sizeof(MpegTSFilter)); |
| 885 | 312 if (!filter) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
313 return NULL; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
314 ts->pids[pid] = filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
315 filter->type = MPEGTS_PES; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
316 filter->pid = pid; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
317 filter->last_cc = -1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
318 pes = &filter->u.pes_filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
319 pes->pes_cb = pes_cb; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
320 pes->opaque = opaque; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
321 return filter; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
322 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
323 |
|
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
1047
diff
changeset
|
324 static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
325 { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
326 int pid; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
327 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
328 pid = filter->pid; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
329 if (filter->type == MPEGTS_SECTION) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
330 av_freep(&filter->u.section_filter.section_buf); |
|
342
0c1b489c96bf
memleak patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
329
diff
changeset
|
331 else if (filter->type == MPEGTS_PES) |
|
0c1b489c96bf
memleak patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
329
diff
changeset
|
332 av_freep(&filter->u.pes_filter.opaque); |
|
0c1b489c96bf
memleak patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
329
diff
changeset
|
333 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
334 av_free(filter); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
335 ts->pids[pid] = NULL; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
336 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
337 |
| 329 | 338 static int analyze(const uint8_t *buf, int size, int packet_size, int *index){ |
| 339 int stat[packet_size]; | |
| 340 int i; | |
| 341 int x=0; | |
| 342 int best_score=0; | |
| 343 | |
| 344 memset(stat, 0, packet_size*sizeof(int)); | |
| 345 | |
| 346 for(x=i=0; i<size; i++){ | |
| 347 if(buf[i] == 0x47){ | |
| 348 stat[x]++; | |
| 349 if(stat[x] > best_score){ | |
| 350 best_score= stat[x]; | |
| 351 if(index) *index= x; | |
| 352 } | |
| 353 } | |
| 354 | |
| 355 x++; | |
| 356 if(x == packet_size) x= 0; | |
| 357 } | |
| 358 | |
| 359 return best_score; | |
| 360 } | |
| 361 | |
| 0 | 362 /* autodetect fec presence. Must have at least 1024 bytes */ |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
363 static int get_packet_size(const uint8_t *buf, int size) |
| 0 | 364 { |
| 891 | 365 int score, fec_score, dvhs_score; |
| 0 | 366 |
| 367 if (size < (TS_FEC_PACKET_SIZE * 5 + 1)) | |
| 368 return -1; | |
| 885 | 369 |
| 329 | 370 score = analyze(buf, size, TS_PACKET_SIZE, NULL); |
| 891 | 371 dvhs_score = analyze(buf, size, TS_DVHS_PACKET_SIZE, NULL); |
| 329 | 372 fec_score= analyze(buf, size, TS_FEC_PACKET_SIZE, NULL); |
| 891 | 373 // av_log(NULL, AV_LOG_DEBUG, "score: %d, dvhs_score: %d, fec_score: %d \n", score, dvhs_score, fec_score); |
| 885 | 374 |
| 891 | 375 if (score > fec_score && score > dvhs_score) return TS_PACKET_SIZE; |
| 376 else if(dvhs_score > score && dvhs_score > fec_score) return TS_DVHS_PACKET_SIZE; | |
| 377 else if(score < fec_score && dvhs_score < fec_score) return TS_FEC_PACKET_SIZE; | |
| 329 | 378 else return -1; |
| 0 | 379 } |
| 380 | |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
381 typedef struct SectionHeader { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
382 uint8_t tid; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
383 uint16_t id; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
384 uint8_t version; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
385 uint8_t sec_num; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
386 uint8_t last_sec_num; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
387 } SectionHeader; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
388 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
389 static inline int get8(const uint8_t **pp, const uint8_t *p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
390 { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
391 const uint8_t *p; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
392 int c; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
393 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
394 p = *pp; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
395 if (p >= p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
396 return -1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
397 c = *p++; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
398 *pp = p; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
399 return c; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
400 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
401 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
402 static inline int get16(const uint8_t **pp, const uint8_t *p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
403 { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
404 const uint8_t *p; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
405 int c; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
406 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
407 p = *pp; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
408 if ((p + 1) >= p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
409 return -1; |
| 2222 | 410 c = AV_RB16(p); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
411 p += 2; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
412 *pp = p; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
413 return c; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
414 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
415 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
416 /* read and allocate a DVB string preceeded by its length */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
417 static char *getstr8(const uint8_t **pp, const uint8_t *p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
418 { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
419 int len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
420 const uint8_t *p; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
421 char *str; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
422 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
423 p = *pp; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
424 len = get8(&p, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
425 if (len < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
426 return NULL; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
427 if ((p + len) > p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
428 return NULL; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
429 str = av_malloc(len + 1); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
430 if (!str) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
431 return NULL; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
432 memcpy(str, p, len); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
433 str[len] = '\0'; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
434 p += len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
435 *pp = p; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
436 return str; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
437 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
438 |
| 885 | 439 static int parse_section_header(SectionHeader *h, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
440 const uint8_t **pp, const uint8_t *p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
441 { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
442 int val; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
443 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
444 val = get8(pp, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
445 if (val < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
446 return -1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
447 h->tid = val; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
448 *pp += 2; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
449 val = get16(pp, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
450 if (val < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
451 return -1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
452 h->id = val; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
453 val = get8(pp, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
454 if (val < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
455 return -1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
456 h->version = (val >> 1) & 0x1f; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
457 val = get8(pp, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
458 if (val < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
459 return -1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
460 h->sec_num = val; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
461 val = get8(pp, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
462 if (val < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
463 return -1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
464 h->last_sec_num = val; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
465 return 0; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
466 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
467 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
468 |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
469 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
470 { |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
471 MpegTSContext *ts = filter->u.section_filter.opaque; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
472 SectionHeader h1, *h = &h1; |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
473 PESContext *pes; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
474 AVStream *st; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
475 const uint8_t *p, *p_end, *desc_list_end, *desc_end; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
476 int program_info_length, pcr_pid, pid, stream_type; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
477 int desc_list_len, desc_len, desc_tag; |
|
851
62e66722e9bb
Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents:
820
diff
changeset
|
478 int comp_page = 0, anc_page = 0; /* initialize to kill warnings */ |
| 2101 | 479 char language[4] = {0}; /* initialize to kill warnings */ |
| 885 | 480 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
481 #ifdef DEBUG_SI |
| 1748 | 482 av_log(ts->stream, AV_LOG_DEBUG, "PMT: len %i\n", section_len); |
|
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1787
diff
changeset
|
483 av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
484 #endif |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
485 p_end = section + section_len - 4; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
486 p = section; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
487 if (parse_section_header(h, &p, p_end) < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
488 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
489 #ifdef DEBUG_SI |
| 1748 | 490 av_log(ts->stream, AV_LOG_DEBUG, "sid=0x%x sec_num=%d/%d\n", |
|
1724
940907f49a33
"converts printf's to avlog's" patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1481
diff
changeset
|
491 h->id, h->sec_num, h->last_sec_num); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
492 #endif |
|
2134
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
493 if (h->tid != PMT_TID) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
494 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
495 |
|
2575
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
496 clear_program(ts, h->id); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
497 pcr_pid = get16(&p, p_end) & 0x1fff; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
498 if (pcr_pid < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
499 return; |
|
2575
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
500 add_pid_to_pmt(ts, h->id, pcr_pid); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
501 #ifdef DEBUG_SI |
| 1748 | 502 av_log(ts->stream, AV_LOG_DEBUG, "pcr_pid=0x%x\n", pcr_pid); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
503 #endif |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
504 program_info_length = get16(&p, p_end) & 0xfff; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
505 if (program_info_length < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
506 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
507 p += program_info_length; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
508 if (p >= p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
509 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
510 for(;;) { |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
511 language[0] = 0; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
512 st = 0; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
513 stream_type = get8(&p, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
514 if (stream_type < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
515 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
516 pid = get16(&p, p_end) & 0x1fff; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
517 if (pid < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
518 break; |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
519 desc_list_len = get16(&p, p_end) & 0xfff; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
520 if (desc_list_len < 0) |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
521 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
522 desc_list_end = p + desc_list_len; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
523 if (desc_list_end > p_end) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
524 break; |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
525 for(;;) { |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
526 desc_tag = get8(&p, desc_list_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
527 if (desc_tag < 0) |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
528 break; |
|
1164
55627fca95a1
Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents:
1124
diff
changeset
|
529 if (stream_type == STREAM_TYPE_PRIVATE_DATA) { |
|
55627fca95a1
Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents:
1124
diff
changeset
|
530 if((desc_tag == 0x6A) || (desc_tag == 0x7A)) { |
|
1047
76c75a88560d
This patch simply adds demuxing support for AC-3 streams in DVB TS
mru
parents:
1046
diff
changeset
|
531 /*assume DVB AC-3 Audio*/ |
|
76c75a88560d
This patch simply adds demuxing support for AC-3 streams in DVB TS
mru
parents:
1046
diff
changeset
|
532 stream_type = STREAM_TYPE_AUDIO_AC3; |
|
1164
55627fca95a1
Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents:
1124
diff
changeset
|
533 } else if(desc_tag == 0x7B) { |
|
55627fca95a1
Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents:
1124
diff
changeset
|
534 /* DVB DTS audio */ |
|
55627fca95a1
Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents:
1124
diff
changeset
|
535 stream_type = STREAM_TYPE_AUDIO_DTS; |
|
55627fca95a1
Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents:
1124
diff
changeset
|
536 } |
|
1047
76c75a88560d
This patch simply adds demuxing support for AC-3 streams in DVB TS
mru
parents:
1046
diff
changeset
|
537 } |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
538 desc_len = get8(&p, desc_list_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
539 desc_end = p + desc_len; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
540 if (desc_end > desc_list_end) |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
541 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
542 #ifdef DEBUG_SI |
| 1748 | 543 av_log(ts->stream, AV_LOG_DEBUG, "tag: 0x%02x len=%d\n", |
|
1724
940907f49a33
"converts printf's to avlog's" patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1481
diff
changeset
|
544 desc_tag, desc_len); |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
545 #endif |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
546 switch(desc_tag) { |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
547 case DVB_SUBT_DESCID: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
548 if (stream_type == STREAM_TYPE_PRIVATE_DATA) |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
549 stream_type = STREAM_TYPE_SUBTITLE_DVB; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
550 |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
551 language[0] = get8(&p, desc_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
552 language[1] = get8(&p, desc_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
553 language[2] = get8(&p, desc_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
554 language[3] = 0; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
555 get8(&p, desc_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
556 comp_page = get16(&p, desc_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
557 anc_page = get16(&p, desc_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
558 |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
559 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
560 case 0x0a: /* ISO 639 language descriptor */ |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
561 language[0] = get8(&p, desc_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
562 language[1] = get8(&p, desc_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
563 language[2] = get8(&p, desc_end); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
564 language[3] = 0; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
565 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
566 default: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
567 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
568 } |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
569 p = desc_end; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
570 } |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
571 p = desc_list_end; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
572 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
573 #ifdef DEBUG_SI |
| 1748 | 574 av_log(ts->stream, AV_LOG_DEBUG, "stream_type=%d pid=0x%x\n", |
|
1724
940907f49a33
"converts printf's to avlog's" patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1481
diff
changeset
|
575 stream_type, pid); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
576 #endif |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
577 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
578 /* now create ffmpeg stream */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
579 switch(stream_type) { |
|
160
9bde37b1a5ce
try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents:
152
diff
changeset
|
580 case STREAM_TYPE_AUDIO_MPEG1: |
|
9bde37b1a5ce
try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents:
152
diff
changeset
|
581 case STREAM_TYPE_AUDIO_MPEG2: |
|
9bde37b1a5ce
try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents:
152
diff
changeset
|
582 case STREAM_TYPE_VIDEO_MPEG1: |
|
9bde37b1a5ce
try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents:
152
diff
changeset
|
583 case STREAM_TYPE_VIDEO_MPEG2: |
|
313
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M?ns Rullg?rd))
michael
parents:
310
diff
changeset
|
584 case STREAM_TYPE_VIDEO_MPEG4: |
|
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M?ns Rullg?rd))
michael
parents:
310
diff
changeset
|
585 case STREAM_TYPE_VIDEO_H264: |
| 1774 | 586 case STREAM_TYPE_VIDEO_VC1: |
|
313
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M?ns Rullg?rd))
michael
parents:
310
diff
changeset
|
587 case STREAM_TYPE_AUDIO_AAC: |
|
165
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
160
diff
changeset
|
588 case STREAM_TYPE_AUDIO_AC3: |
|
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
474
diff
changeset
|
589 case STREAM_TYPE_AUDIO_DTS: |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
590 case STREAM_TYPE_SUBTITLE_DVB: |
|
2761
5e808c3a55a8
When new streams are detected, look for old filters and close them out.
heydowns
parents:
2651
diff
changeset
|
591 if(ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES){ |
|
2134
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
592 pes= ts->pids[pid]->u.pes_filter.opaque; |
|
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
593 st= pes->st; |
|
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
594 }else{ |
|
2761
5e808c3a55a8
When new streams are detected, look for old filters and close them out.
heydowns
parents:
2651
diff
changeset
|
595 if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably |
|
2157
0103a8479df5
proper per stream pcr_pid support by (Wolfram Gloger wmglo dent.med.uni-muenchen@de )
michael
parents:
2146
diff
changeset
|
596 pes = add_pes_stream(ts, pid, pcr_pid, stream_type); |
| 2137 | 597 if (pes) |
| 598 st = new_pes_av_stream(pes, 0); | |
|
2134
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
599 } |
|
2575
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
600 add_pid_to_pmt(ts, h->id, pid); |
|
2651
38639f62f23f
associate to each AVProgram the indexes of the AVStreams contained in it
nicodvb
parents:
2575
diff
changeset
|
601 if(st) |
|
38639f62f23f
associate to each AVProgram the indexes of the AVStreams contained in it
nicodvb
parents:
2575
diff
changeset
|
602 av_program_add_stream_index(ts->stream, h->id, st->index); |
| 2138 | 603 break; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
604 default: |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
605 /* we ignore the other streams */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
606 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
607 } |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
608 |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
609 if (st) { |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
610 if (language[0] != 0) { |
| 2159 | 611 memcpy(st->language, language, 4); |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
612 } |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
613 |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
614 if (stream_type == STREAM_TYPE_SUBTITLE_DVB) { |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
615 st->codec->sub_id = (anc_page << 16) | comp_page; |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
616 } |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
617 } |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
618 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
619 /* all parameters are there */ |
|
2134
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
620 ts->stop_parse++; |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
621 mpegts_close_filter(ts, filter); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
622 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
623 |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
624 static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
625 { |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
626 MpegTSContext *ts = filter->u.section_filter.opaque; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
627 SectionHeader h1, *h = &h1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
628 const uint8_t *p, *p_end; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
629 int sid, pmt_pid; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
630 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
631 #ifdef DEBUG_SI |
| 1748 | 632 av_log(ts->stream, AV_LOG_DEBUG, "PAT:\n"); |
|
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1787
diff
changeset
|
633 av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
634 #endif |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
635 p_end = section + section_len - 4; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
636 p = section; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
637 if (parse_section_header(h, &p, p_end) < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
638 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
639 if (h->tid != PAT_TID) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
640 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
641 |
|
2575
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
642 clear_programs(ts); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
643 for(;;) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
644 sid = get16(&p, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
645 if (sid < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
646 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
647 pmt_pid = get16(&p, p_end) & 0x1fff; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
648 if (pmt_pid < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
649 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
650 #ifdef DEBUG_SI |
| 1748 | 651 av_log(ts->stream, AV_LOG_DEBUG, "sid=0x%x pid=0x%x\n", sid, pmt_pid); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
652 #endif |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
653 if (sid == 0x0000) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
654 /* NIT info */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
655 } else { |
|
2574
9e51e62f5bdd
replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents:
2555
diff
changeset
|
656 av_new_program(ts->stream, sid); |
|
2134
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
657 ts->stop_parse--; |
| 2137 | 658 mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1); |
|
2575
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
659 add_pat_entry(ts, sid); |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
660 add_pid_to_pmt(ts, sid, 0); //add pat pid to program |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
661 add_pid_to_pmt(ts, sid, pmt_pid); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
662 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
663 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
664 /* not found */ |
|
2134
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
665 ts->stop_parse++; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
666 |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
667 mpegts_close_filter(ts, filter); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
668 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
669 |
|
2134
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
670 static void mpegts_set_service(MpegTSContext *ts) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
671 { |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
672 mpegts_open_section_filter(ts, PAT_PID, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
673 pat_cb, ts, 1); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
674 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
675 |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
676 static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
677 { |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
678 MpegTSContext *ts = filter->u.section_filter.opaque; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
679 SectionHeader h1, *h = &h1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
680 const uint8_t *p, *p_end, *desc_list_end, *desc_end; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
681 int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
682 char *name, *provider_name; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
683 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
684 #ifdef DEBUG_SI |
| 1748 | 685 av_log(ts->stream, AV_LOG_DEBUG, "SDT:\n"); |
|
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1787
diff
changeset
|
686 av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
687 #endif |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
688 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
689 p_end = section + section_len - 4; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
690 p = section; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
691 if (parse_section_header(h, &p, p_end) < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
692 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
693 if (h->tid != SDT_TID) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
694 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
695 onid = get16(&p, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
696 if (onid < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
697 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
698 val = get8(&p, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
699 if (val < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
700 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
701 for(;;) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
702 sid = get16(&p, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
703 if (sid < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
704 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
705 val = get8(&p, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
706 if (val < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
707 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
708 desc_list_len = get16(&p, p_end) & 0xfff; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
709 if (desc_list_len < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
710 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
711 desc_list_end = p + desc_list_len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
712 if (desc_list_end > p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
713 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
714 for(;;) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
715 desc_tag = get8(&p, desc_list_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
716 if (desc_tag < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
717 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
718 desc_len = get8(&p, desc_list_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
719 desc_end = p + desc_len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
720 if (desc_end > desc_list_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
721 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
722 #ifdef DEBUG_SI |
| 1748 | 723 av_log(ts->stream, AV_LOG_DEBUG, "tag: 0x%02x len=%d\n", |
|
1724
940907f49a33
"converts printf's to avlog's" patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents:
1481
diff
changeset
|
724 desc_tag, desc_len); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
725 #endif |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
726 switch(desc_tag) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
727 case 0x48: |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
728 service_type = get8(&p, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
729 if (service_type < 0) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
730 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
731 provider_name = getstr8(&p, p_end); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
732 if (!provider_name) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
733 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
734 name = getstr8(&p, p_end); |
|
2574
9e51e62f5bdd
replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents:
2555
diff
changeset
|
735 if (name) { |
|
9e51e62f5bdd
replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents:
2555
diff
changeset
|
736 AVProgram *program = av_new_program(ts->stream, sid); |
|
9e51e62f5bdd
replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents:
2555
diff
changeset
|
737 if(program) |
|
9e51e62f5bdd
replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents:
2555
diff
changeset
|
738 av_set_program_name(program, provider_name, name); |
|
9e51e62f5bdd
replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents:
2555
diff
changeset
|
739 } |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
740 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
741 default: |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
742 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
743 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
744 p = desc_end; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
745 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
746 p = desc_list_end; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
747 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
748 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
749 |
|
170
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
750 /* scan services in a transport stream by looking at the SDT */ |
|
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
1047
diff
changeset
|
751 static void mpegts_scan_sdt(MpegTSContext *ts) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
752 { |
|
2129
020f3b7f0eb0
do not perform SDT scan at the begin (this avoids a timeconsuming search for
michael
parents:
2128
diff
changeset
|
753 mpegts_open_section_filter(ts, SDT_PID, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
754 sdt_cb, ts, 1); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
755 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
756 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
757 static int64_t get_pts(const uint8_t *p) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
758 { |
| 2222 | 759 int64_t pts = (int64_t)((p[0] >> 1) & 0x07) << 30; |
| 760 pts |= (AV_RB16(p + 1) >> 1) << 15; | |
| 761 pts |= AV_RB16(p + 3) >> 1; | |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
762 return pts; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
763 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
764 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
765 /* return non zero if a packet could be constructed */ |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
766 static void mpegts_push_data(MpegTSFilter *filter, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
767 const uint8_t *buf, int buf_size, int is_start) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
768 { |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
769 PESContext *pes = filter->u.pes_filter.opaque; |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
770 MpegTSContext *ts = pes->ts; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
771 const uint8_t *p; |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
772 int len, code; |
| 885 | 773 |
|
2111
4aafc6050f39
kill completely idiotic code which hides all but 2 streams
michael
parents:
2110
diff
changeset
|
774 if(!ts->pkt) |
|
4aafc6050f39
kill completely idiotic code which hides all but 2 streams
michael
parents:
2110
diff
changeset
|
775 return; |
|
4aafc6050f39
kill completely idiotic code which hides all but 2 streams
michael
parents:
2110
diff
changeset
|
776 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
777 if (is_start) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
778 pes->state = MPEGTS_HEADER; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
779 pes->data_index = 0; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
780 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
781 p = buf; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
782 while (buf_size > 0) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
783 switch(pes->state) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
784 case MPEGTS_HEADER: |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
785 len = PES_START_SIZE - pes->data_index; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
786 if (len > buf_size) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
787 len = buf_size; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
788 memcpy(pes->header + pes->data_index, p, len); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
789 pes->data_index += len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
790 p += len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
791 buf_size -= len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
792 if (pes->data_index == PES_START_SIZE) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
793 /* we got all the PES or section header. We can now |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
794 decide */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
795 #if 0 |
|
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1787
diff
changeset
|
796 av_hex_dump_log(pes->stream, AV_LOG_DEBUG, pes->header, pes->data_index); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
797 #endif |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
798 if (pes->header[0] == 0x00 && pes->header[1] == 0x00 && |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
799 pes->header[2] == 0x01) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
800 /* it must be an mpeg2 PES stream */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
801 code = pes->header[3] | 0x100; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
802 if (!((code >= 0x1c0 && code <= 0x1df) || |
|
165
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
160
diff
changeset
|
803 (code >= 0x1e0 && code <= 0x1ef) || |
| 1774 | 804 (code == 0x1bd) || (code == 0x1fd))) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
805 goto skip; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
806 if (!pes->st) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
807 /* allocate stream */ |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
808 new_pes_av_stream(pes, code); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
809 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
810 pes->state = MPEGTS_PESHEADER_FILL; |
| 2222 | 811 pes->total_size = AV_RB16(pes->header + 4); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
812 /* NOTE: a zero total size means the PES size is |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
813 unbounded */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
814 if (pes->total_size) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
815 pes->total_size += 6; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
816 pes->pes_header_size = pes->header[8] + 9; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
817 } else { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
818 /* otherwise, it should be a table */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
819 /* skip packet */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
820 skip: |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
821 pes->state = MPEGTS_SKIP; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
822 continue; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
823 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
824 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
825 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
826 /**********************************************/ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
827 /* PES packing parsing */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
828 case MPEGTS_PESHEADER_FILL: |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
829 len = pes->pes_header_size - pes->data_index; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
830 if (len > buf_size) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
831 len = buf_size; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
832 memcpy(pes->header + pes->data_index, p, len); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
833 pes->data_index += len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
834 p += len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
835 buf_size -= len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
836 if (pes->data_index == pes->pes_header_size) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
837 const uint8_t *r; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
838 unsigned int flags; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
839 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
840 flags = pes->header[7]; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
841 r = pes->header + 9; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
842 pes->pts = AV_NOPTS_VALUE; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
843 pes->dts = AV_NOPTS_VALUE; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
844 if ((flags & 0xc0) == 0x80) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
845 pes->pts = get_pts(r); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
846 r += 5; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
847 } else if ((flags & 0xc0) == 0xc0) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
848 pes->pts = get_pts(r); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
849 r += 5; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
850 pes->dts = get_pts(r); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
851 r += 5; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
852 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
853 /* we got the full header. We parse it and get the payload */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
854 pes->state = MPEGTS_PAYLOAD; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
855 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
856 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
857 case MPEGTS_PAYLOAD: |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
858 if (pes->total_size) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
859 len = pes->total_size - pes->data_index; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
860 if (len > buf_size) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
861 len = buf_size; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
862 } else { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
863 len = buf_size; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
864 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
865 if (len > 0) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
866 AVPacket *pkt = ts->pkt; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
867 if (pes->st && av_new_packet(pkt, len) == 0) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
868 memcpy(pkt->data, p, len); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
869 pkt->stream_index = pes->st->index; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
870 pkt->pts = pes->pts; |
|
367
3fca8e9142a4
avsync patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
871 pkt->dts = pes->dts; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
872 /* reset pts values */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
873 pes->pts = AV_NOPTS_VALUE; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
874 pes->dts = AV_NOPTS_VALUE; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
875 ts->stop_parse = 1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
876 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
877 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
878 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
879 buf_size = 0; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
880 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
881 case MPEGTS_SKIP: |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
882 buf_size = 0; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
883 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
884 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
885 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
886 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
887 |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
888 static AVStream* new_pes_av_stream(PESContext *pes, uint32_t code) |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
889 { |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
890 AVStream *st; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
891 int codec_type, codec_id; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
892 |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
893 switch(pes->stream_type){ |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
894 case STREAM_TYPE_AUDIO_MPEG1: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
895 case STREAM_TYPE_AUDIO_MPEG2: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
896 codec_type = CODEC_TYPE_AUDIO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
897 codec_id = CODEC_ID_MP3; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
898 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
899 case STREAM_TYPE_VIDEO_MPEG1: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
900 case STREAM_TYPE_VIDEO_MPEG2: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
901 codec_type = CODEC_TYPE_VIDEO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
902 codec_id = CODEC_ID_MPEG2VIDEO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
903 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
904 case STREAM_TYPE_VIDEO_MPEG4: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
905 codec_type = CODEC_TYPE_VIDEO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
906 codec_id = CODEC_ID_MPEG4; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
907 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
908 case STREAM_TYPE_VIDEO_H264: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
909 codec_type = CODEC_TYPE_VIDEO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
910 codec_id = CODEC_ID_H264; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
911 break; |
| 1774 | 912 case STREAM_TYPE_VIDEO_VC1: |
| 913 codec_type = CODEC_TYPE_VIDEO; | |
| 914 codec_id = CODEC_ID_VC1; | |
| 915 break; | |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
916 case STREAM_TYPE_AUDIO_AAC: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
917 codec_type = CODEC_TYPE_AUDIO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
918 codec_id = CODEC_ID_AAC; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
919 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
920 case STREAM_TYPE_AUDIO_AC3: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
921 codec_type = CODEC_TYPE_AUDIO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
922 codec_id = CODEC_ID_AC3; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
923 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
924 case STREAM_TYPE_AUDIO_DTS: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
925 codec_type = CODEC_TYPE_AUDIO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
926 codec_id = CODEC_ID_DTS; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
927 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
928 case STREAM_TYPE_SUBTITLE_DVB: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
929 codec_type = CODEC_TYPE_SUBTITLE; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
930 codec_id = CODEC_ID_DVB_SUBTITLE; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
931 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
932 default: |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
933 if (code >= 0x1c0 && code <= 0x1df) { |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
934 codec_type = CODEC_TYPE_AUDIO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
935 codec_id = CODEC_ID_MP2; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
936 } else if (code == 0x1bd) { |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
937 codec_type = CODEC_TYPE_AUDIO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
938 codec_id = CODEC_ID_AC3; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
939 } else { |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
940 codec_type = CODEC_TYPE_VIDEO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
941 codec_id = CODEC_ID_MPEG1VIDEO; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
942 } |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
943 break; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
944 } |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
945 st = av_new_stream(pes->stream, pes->pid); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
946 if (st) { |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
947 av_set_pts_info(st, 33, 1, 90000); |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
948 st->priv_data = pes; |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
949 st->codec->codec_type = codec_type; |
|
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
950 st->codec->codec_id = codec_id; |
| 2023 | 951 st->need_parsing = AVSTREAM_PARSE_FULL; |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
952 pes->st = st; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
953 } |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
954 return st; |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
955 } |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
956 |
|
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
957 |
|
2157
0103a8479df5
proper per stream pcr_pid support by (Wolfram Gloger wmglo dent.med.uni-muenchen@de )
michael
parents:
2146
diff
changeset
|
958 static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid, int stream_type) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
959 { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
960 MpegTSFilter *tss; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
961 PESContext *pes; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
962 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
963 /* if no pid found, then add a pid context */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
964 pes = av_mallocz(sizeof(PESContext)); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
965 if (!pes) |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
966 return 0; |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
967 pes->ts = ts; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
968 pes->stream = ts->stream; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
969 pes->pid = pid; |
|
2157
0103a8479df5
proper per stream pcr_pid support by (Wolfram Gloger wmglo dent.med.uni-muenchen@de )
michael
parents:
2146
diff
changeset
|
970 pes->pcr_pid = pcr_pid; |
|
313
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M?ns Rullg?rd))
michael
parents:
310
diff
changeset
|
971 pes->stream_type = stream_type; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
972 tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
973 if (!tss) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
974 av_free(pes); |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
975 return 0; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
976 } |
|
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
775
diff
changeset
|
977 return pes; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
978 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
979 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
980 /* handle one TS packet */ |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
981 static void handle_packet(MpegTSContext *ts, const uint8_t *packet) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
982 { |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
983 AVFormatContext *s = ts->stream; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
984 MpegTSFilter *tss; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
985 int len, pid, cc, cc_ok, afc, is_start; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
986 const uint8_t *p, *p_end; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
987 |
| 2222 | 988 pid = AV_RB16(packet + 1) & 0x1fff; |
|
2575
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
989 if(pid && discard_pid(ts, pid)) |
|
06d31789d338
added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents:
2574
diff
changeset
|
990 return; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
991 is_start = packet[1] & 0x40; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
992 tss = ts->pids[pid]; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
993 if (ts->auto_guess && tss == NULL && is_start) { |
|
2157
0103a8479df5
proper per stream pcr_pid support by (Wolfram Gloger wmglo dent.med.uni-muenchen@de )
michael
parents:
2146
diff
changeset
|
994 add_pes_stream(ts, pid, -1, 0); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
995 tss = ts->pids[pid]; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
996 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
997 if (!tss) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
998 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
999 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1000 /* continuity check (currently not used) */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1001 cc = (packet[3] & 0xf); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1002 cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc)); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1003 tss->last_cc = cc; |
| 885 | 1004 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1005 /* skip adaptation field */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1006 afc = (packet[3] >> 4) & 3; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1007 p = packet + 4; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1008 if (afc == 0) /* reserved value */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1009 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1010 if (afc == 2) /* adaptation field only */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1011 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1012 if (afc == 3) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1013 /* skip adapation field */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1014 p += p[0] + 1; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1015 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1016 /* if past the end of packet, ignore */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1017 p_end = packet + TS_PACKET_SIZE; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1018 if (p >= p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1019 return; |
| 885 | 1020 |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1021 if (tss->type == MPEGTS_SECTION) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1022 if (is_start) { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1023 /* pointer field present */ |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1024 len = *p++; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1025 if (p + len > p_end) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1026 return; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1027 if (len && cc_ok) { |
|
675
29a19aec26b2
Writing to freed memory in write_section_data() patch by (Wolfram Gloger <wmglo dent dot med dot uni-muenchen de>)
michael
parents:
555
diff
changeset
|
1028 /* write remaining section bytes */ |
| 885 | 1029 write_section_data(s, tss, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1030 p, len, 0); |
|
675
29a19aec26b2
Writing to freed memory in write_section_data() patch by (Wolfram Gloger <wmglo dent dot med dot uni-muenchen de>)
michael
parents:
555
diff
changeset
|
1031 /* check whether filter has been closed */ |
|
29a19aec26b2
Writing to freed memory in write_section_data() patch by (Wolfram Gloger <wmglo dent dot med dot uni-muenchen de>)
michael
parents:
555
diff
changeset
|
1032 if (!ts->pids[pid]) |
|
29a19aec26b2
Writing to freed memory in write_section_data() patch by (Wolfram Gloger <wmglo dent dot med dot uni-muenchen de>)
michael
parents:
555
diff
changeset
|
1033 return; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1034 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1035 p += len; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1036 if (p < p_end) { |
| 885 | 1037 write_section_data(s, tss, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1038 p, p_end - p, 1); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1039 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1040 } else { |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1041 if (cc_ok) { |
| 885 | 1042 write_section_data(s, tss, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1043 p, p_end - p, 0); |
|
170
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1044 } |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1045 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1046 } else { |
|
2132
c8e642dd5f9c
passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents:
2129
diff
changeset
|
1047 tss->u.pes_filter.pes_cb(tss, |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1048 p, p_end - p, is_start); |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1049 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1050 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1051 |
|
170
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1052 /* XXX: try to find a better synchro over several packets (use |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1053 get_packet_size() ?) */ |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1054 static int mpegts_resync(ByteIOContext *pb) |
|
170
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1055 { |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1056 int c, i; |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1057 |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1058 for(i = 0;i < MAX_RESYNC_SIZE; i++) { |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1059 c = url_fgetc(pb); |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1060 if (c < 0) |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1061 return -1; |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1062 if (c == 0x47) { |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1063 url_fseek(pb, -1, SEEK_CUR); |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1064 return 0; |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1065 } |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1066 } |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1067 /* no sync found */ |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1068 return -1; |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1069 } |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1070 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1071 /* return -1 if error or EOF. Return 0 if OK. */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1072 static int read_packet(ByteIOContext *pb, uint8_t *buf, int raw_packet_size) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1073 { |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1074 int skip, len; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1075 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1076 for(;;) { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1077 len = get_buffer(pb, buf, TS_PACKET_SIZE); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1078 if (len != TS_PACKET_SIZE) |
|
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2247
diff
changeset
|
1079 return AVERROR(EIO); |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1080 /* check paquet sync byte */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1081 if (buf[0] != 0x47) { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1082 /* find a new packet start */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1083 url_fseek(pb, -TS_PACKET_SIZE, SEEK_CUR); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1084 if (mpegts_resync(pb) < 0) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1085 return AVERROR_INVALIDDATA; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1086 else |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1087 continue; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1088 } else { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1089 skip = raw_packet_size - TS_PACKET_SIZE; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1090 if (skip > 0) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1091 url_fskip(pb, skip); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1092 break; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1093 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1094 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1095 return 0; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1096 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1097 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1098 static int handle_packets(MpegTSContext *ts, int nb_packets) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1099 { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1100 AVFormatContext *s = ts->stream; |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1101 ByteIOContext *pb = s->pb; |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1102 uint8_t packet[TS_PACKET_SIZE]; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1103 int packet_num, ret; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1104 |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1105 ts->stop_parse = 0; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1106 packet_num = 0; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1107 for(;;) { |
|
2134
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
1108 if (ts->stop_parse>0) |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1109 break; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1110 packet_num++; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1111 if (nb_packets != 0 && packet_num >= nb_packets) |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1112 break; |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1113 ret = read_packet(pb, packet, ts->raw_packet_size); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1114 if (ret != 0) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1115 return ret; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1116 handle_packet(ts, packet); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1117 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1118 return 0; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1119 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1120 |
| 0 | 1121 static int mpegts_probe(AVProbeData *p) |
| 1122 { | |
|
170
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1123 #if 1 |
| 329 | 1124 const int size= p->buf_size; |
| 891 | 1125 int score, fec_score, dvhs_score; |
| 329 | 1126 #define CHECK_COUNT 10 |
| 885 | 1127 |
| 329 | 1128 if (size < (TS_FEC_PACKET_SIZE * CHECK_COUNT)) |
| 1129 return -1; | |
| 885 | 1130 |
| 329 | 1131 score = analyze(p->buf, TS_PACKET_SIZE *CHECK_COUNT, TS_PACKET_SIZE, NULL); |
| 891 | 1132 dvhs_score = analyze(p->buf, TS_DVHS_PACKET_SIZE *CHECK_COUNT, TS_DVHS_PACKET_SIZE, NULL); |
| 329 | 1133 fec_score= analyze(p->buf, TS_FEC_PACKET_SIZE*CHECK_COUNT, TS_FEC_PACKET_SIZE, NULL); |
| 891 | 1134 // av_log(NULL, AV_LOG_DEBUG, "score: %d, dvhs_score: %d, fec_score: %d \n", score, dvhs_score, fec_score); |
| 885 | 1135 |
| 329 | 1136 // we need a clear definition for the returned score otherwise things will become messy sooner or later |
| 891 | 1137 if (score > fec_score && score > dvhs_score && score > 6) return AVPROBE_SCORE_MAX + score - CHECK_COUNT; |
| 1138 else if(dvhs_score > score && dvhs_score > fec_score && dvhs_score > 6) return AVPROBE_SCORE_MAX + dvhs_score - CHECK_COUNT; | |
| 329 | 1139 else if( fec_score > 6) return AVPROBE_SCORE_MAX + fec_score - CHECK_COUNT; |
| 1140 else return -1; | |
|
170
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1141 #else |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1142 /* only use the extension for safer guess */ |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1143 if (match_ext(p->filename, "ts")) |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1144 return AVPROBE_SCORE_MAX; |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1145 else |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1146 return 0; |
|
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1147 #endif |
| 0 | 1148 } |
| 1149 | |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1150 /* return the 90 kHz PCR and the extension for the 27 MHz PCR. return |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1151 (-1) if not available */ |
| 885 | 1152 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1153 const uint8_t *packet) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1154 { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1155 int afc, len, flags; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1156 const uint8_t *p; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1157 unsigned int v; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1158 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1159 afc = (packet[3] >> 4) & 3; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1160 if (afc <= 1) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1161 return -1; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1162 p = packet + 4; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1163 len = p[0]; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1164 p++; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1165 if (len == 0) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1166 return -1; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1167 flags = *p++; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1168 len--; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1169 if (!(flags & 0x10)) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1170 return -1; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1171 if (len < 6) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1172 return -1; |
| 2222 | 1173 v = AV_RB32(p); |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1174 *ppcr_high = ((int64_t)v << 1) | (p[4] >> 7); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1175 *ppcr_low = ((p[4] & 1) << 8) | p[5]; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1176 return 0; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1177 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1178 |
| 0 | 1179 static int mpegts_read_header(AVFormatContext *s, |
| 1180 AVFormatParameters *ap) | |
| 1181 { | |
| 1182 MpegTSContext *ts = s->priv_data; | |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1183 ByteIOContext *pb = s->pb; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1184 uint8_t buf[1024]; |
| 2135 | 1185 int len; |
| 65 | 1186 int64_t pos; |
| 474 | 1187 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1188 if (ap) { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1189 ts->mpeg2ts_compute_pcr = ap->mpeg2ts_compute_pcr; |
|
2108
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1190 if(ap->mpeg2ts_raw){ |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1191 av_log(s, AV_LOG_ERROR, "use mpegtsraw_demuxer!\n"); |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1192 return -1; |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1193 } |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1194 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1195 |
| 0 | 1196 /* read the first 1024 bytes to get packet size */ |
| 1197 pos = url_ftell(pb); | |
| 1198 len = get_buffer(pb, buf, sizeof(buf)); | |
| 1199 if (len != sizeof(buf)) | |
| 1200 goto fail; | |
| 1201 ts->raw_packet_size = get_packet_size(buf, sizeof(buf)); | |
| 1202 if (ts->raw_packet_size <= 0) | |
| 1203 goto fail; | |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1204 ts->stream = s; |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1205 ts->auto_guess = 0; |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1206 |
|
2108
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1207 if (s->iformat == &mpegts_demuxer) { |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1208 /* normal demux */ |
|
170
0543d27721c1
cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents:
165
diff
changeset
|
1209 |
| 2126 | 1210 /* first do a scaning to get all the services */ |
| 1211 url_fseek(pb, pos, SEEK_SET); | |
| 1212 mpegts_scan_sdt(ts); | |
| 1213 | |
| 2137 | 1214 mpegts_set_service(ts); |
| 885 | 1215 |
| 2137 | 1216 handle_packets(ts, s->probesize); |
| 2126 | 1217 /* if could not find service, enable auto_guess */ |
| 885 | 1218 |
| 2126 | 1219 ts->auto_guess = 1; |
| 885 | 1220 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1221 #ifdef DEBUG_SI |
| 2126 | 1222 av_log(ts->stream, AV_LOG_DEBUG, "tuning done\n"); |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1223 #endif |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1224 s->ctx_flags |= AVFMTCTX_NOHEADER; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1225 } else { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1226 AVStream *st; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1227 int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1228 int64_t pcrs[2], pcr_h; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1229 int packet_count[2]; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1230 uint8_t packet[TS_PACKET_SIZE]; |
| 885 | 1231 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1232 /* only read packets */ |
| 885 | 1233 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1234 st = av_new_stream(s, 0); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1235 if (!st) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1236 goto fail; |
|
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
444
diff
changeset
|
1237 av_set_pts_info(st, 60, 1, 27000000); |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1238 st->codec->codec_type = CODEC_TYPE_DATA; |
|
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1239 st->codec->codec_id = CODEC_ID_MPEG2TS; |
| 885 | 1240 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1241 /* we iterate until we find two PCRs to estimate the bitrate */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1242 pcr_pid = -1; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1243 nb_pcrs = 0; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1244 nb_packets = 0; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1245 for(;;) { |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1246 ret = read_packet(s->pb, packet, ts->raw_packet_size); |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1247 if (ret < 0) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1248 return -1; |
| 2222 | 1249 pid = AV_RB16(packet + 1) & 0x1fff; |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1250 if ((pcr_pid == -1 || pcr_pid == pid) && |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1251 parse_pcr(&pcr_h, &pcr_l, packet) == 0) { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1252 pcr_pid = pid; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1253 packet_count[nb_pcrs] = nb_packets; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1254 pcrs[nb_pcrs] = pcr_h * 300 + pcr_l; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1255 nb_pcrs++; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1256 if (nb_pcrs >= 2) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1257 break; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1258 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1259 nb_packets++; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1260 } |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1261 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1262 /* NOTE1: the bitrate is computed without the FEC */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1263 /* NOTE2: it is only the bitrate of the start of the stream */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1264 ts->pcr_incr = (pcrs[1] - pcrs[0]) / (packet_count[1] - packet_count[0]); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1265 ts->cur_pcr = pcrs[0] - ts->pcr_incr * packet_count[0]; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1266 s->bit_rate = (TS_PACKET_SIZE * 8) * 27e6 / ts->pcr_incr; |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1267 st->codec->bit_rate = s->bit_rate; |
| 743 | 1268 st->start_time = ts->cur_pcr; |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1269 #if 0 |
| 1748 | 1270 av_log(ts->stream, AV_LOG_DEBUG, "start=%0.3f pcr=%0.3f incr=%d\n", |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1271 st->start_time / 1000000.0, pcrs[0] / 27e6, ts->pcr_incr); |
|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1272 #endif |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1273 } |
|
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
107
diff
changeset
|
1274 |
| 0 | 1275 url_fseek(pb, pos, SEEK_SET); |
| 1276 return 0; | |
| 1277 fail: | |
| 1278 return -1; | |
| 1279 } | |
| 1280 | |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1281 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1282 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1283 static int mpegts_raw_read_packet(AVFormatContext *s, |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1284 AVPacket *pkt) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1285 { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1286 MpegTSContext *ts = s->priv_data; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1287 int ret, i; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1288 int64_t pcr_h, next_pcr_h, pos; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1289 int pcr_l, next_pcr_l; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1290 uint8_t pcr_buf[12]; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1291 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1292 if (av_new_packet(pkt, TS_PACKET_SIZE) < 0) |
|
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1774
diff
changeset
|
1293 return AVERROR(ENOMEM); |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1294 pkt->pos= url_ftell(s->pb); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1295 ret = read_packet(s->pb, pkt->data, ts->raw_packet_size); |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1296 if (ret < 0) { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1297 av_free_packet(pkt); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1298 return ret; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1299 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1300 if (ts->mpeg2ts_compute_pcr) { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1301 /* compute exact PCR for each packet */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1302 if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1303 /* we read the next PCR (XXX: optimize it by using a bigger buffer */ |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1304 pos = url_ftell(s->pb); |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1305 for(i = 0; i < MAX_PACKET_READAHEAD; i++) { |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1306 url_fseek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1307 get_buffer(s->pb, pcr_buf, 12); |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1308 if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1309 /* XXX: not precise enough */ |
| 885 | 1310 ts->pcr_incr = ((next_pcr_h - pcr_h) * 300 + (next_pcr_l - pcr_l)) / |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1311 (i + 1); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1312 break; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1313 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1314 } |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1315 url_fseek(s->pb, pos, SEEK_SET); |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1316 /* no next PCR found: we use previous increment */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1317 ts->cur_pcr = pcr_h * 300 + pcr_l; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1318 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1319 pkt->pts = ts->cur_pcr; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1320 pkt->duration = ts->pcr_incr; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1321 ts->cur_pcr += ts->pcr_incr; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1322 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1323 pkt->stream_index = 0; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1324 return 0; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1325 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1326 |
| 0 | 1327 static int mpegts_read_packet(AVFormatContext *s, |
| 1328 AVPacket *pkt) | |
| 1329 { | |
| 1330 MpegTSContext *ts = s->priv_data; | |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1331 |
|
2108
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1332 ts->pkt = pkt; |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1333 return handle_packets(ts, 0); |
| 0 | 1334 } |
| 1335 | |
| 1336 static int mpegts_read_close(AVFormatContext *s) | |
| 1337 { | |
| 1338 MpegTSContext *ts = s->priv_data; | |
| 1339 int i; | |
| 1340 for(i=0;i<NB_PID_MAX;i++) | |
|
342
0c1b489c96bf
memleak patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
329
diff
changeset
|
1341 if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]); |
| 1046 | 1342 |
| 0 | 1343 return 0; |
| 1344 } | |
| 1345 | |
| 885 | 1346 static int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, |
|
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1347 int64_t *ppos, int64_t pos_limit) |
| 310 | 1348 { |
| 1349 MpegTSContext *ts = s->priv_data; | |
| 1350 int64_t pos, timestamp; | |
| 1351 uint8_t buf[TS_PACKET_SIZE]; | |
|
2157
0103a8479df5
proper per stream pcr_pid support by (Wolfram Gloger wmglo dent.med.uni-muenchen@de )
michael
parents:
2146
diff
changeset
|
1352 int pcr_l, pcr_pid = ((PESContext*)s->streams[stream_index]->priv_data)->pcr_pid; |
|
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1353 const int find_next= 1; |
|
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1354 pos = ((*ppos + ts->raw_packet_size - 1) / ts->raw_packet_size) * ts->raw_packet_size; |
| 310 | 1355 if (find_next) { |
| 1356 for(;;) { | |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1357 url_fseek(s->pb, pos, SEEK_SET); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1358 if (get_buffer(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE) |
| 310 | 1359 return AV_NOPTS_VALUE; |
| 2222 | 1360 if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) && |
| 310 | 1361 parse_pcr(×tamp, &pcr_l, buf) == 0) { |
| 1362 break; | |
| 1363 } | |
| 1364 pos += ts->raw_packet_size; | |
| 1365 } | |
| 1366 } else { | |
| 1367 for(;;) { | |
| 1368 pos -= ts->raw_packet_size; | |
| 1369 if (pos < 0) | |
| 1370 return AV_NOPTS_VALUE; | |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1371 url_fseek(s->pb, pos, SEEK_SET); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1372 if (get_buffer(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE) |
| 310 | 1373 return AV_NOPTS_VALUE; |
| 2222 | 1374 if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) && |
| 310 | 1375 parse_pcr(×tamp, &pcr_l, buf) == 0) { |
| 1376 break; | |
| 1377 } | |
| 1378 } | |
| 1379 } | |
| 1380 *ppos = pos; | |
|
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1381 |
| 310 | 1382 return timestamp; |
| 1383 } | |
| 1384 | |
| 555 | 1385 static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){ |
| 474 | 1386 MpegTSContext *ts = s->priv_data; |
| 1387 uint8_t buf[TS_PACKET_SIZE]; | |
| 1388 int64_t pos; | |
| 1389 | |
| 555 | 1390 if(av_seek_frame_binary(s, stream_index, target_ts, flags) < 0) |
| 474 | 1391 return -1; |
| 1392 | |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1393 pos= url_ftell(s->pb); |
| 474 | 1394 |
| 1395 for(;;) { | |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1396 url_fseek(s->pb, pos, SEEK_SET); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1397 if (get_buffer(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE) |
| 474 | 1398 return -1; |
| 2222 | 1399 // pid = AV_RB16(buf + 1) & 0x1fff; |
| 474 | 1400 if(buf[1] & 0x40) break; |
| 1401 pos += ts->raw_packet_size; | |
| 885 | 1402 } |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2761
diff
changeset
|
1403 url_fseek(s->pb, pos, SEEK_SET); |
| 474 | 1404 |
| 1405 return 0; | |
| 1406 } | |
| 1407 | |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1408 /**************************************************************/ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1409 /* parsing functions - called from other demuxers such as RTP */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1410 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1411 MpegTSContext *mpegts_parse_open(AVFormatContext *s) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1412 { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1413 MpegTSContext *ts; |
| 885 | 1414 |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1415 ts = av_mallocz(sizeof(MpegTSContext)); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1416 if (!ts) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1417 return NULL; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1418 /* no stream case, currently used by RTP */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1419 ts->raw_packet_size = TS_PACKET_SIZE; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1420 ts->stream = s; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1421 ts->auto_guess = 1; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1422 return ts; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1423 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1424 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1425 /* return the consumed length if a packet was output, or -1 if no |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1426 packet is output */ |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1427 int mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1428 const uint8_t *buf, int len) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1429 { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1430 int len1; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1431 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1432 len1 = len; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1433 ts->pkt = pkt; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1434 ts->stop_parse = 0; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1435 for(;;) { |
|
2134
16cf48c9af53
dont rescan for information on each pid, but rather do it just once by
michael
parents:
2133
diff
changeset
|
1436 if (ts->stop_parse>0) |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1437 break; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1438 if (len < TS_PACKET_SIZE) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1439 return -1; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1440 if (buf[0] != 0x47) { |
|
444
d42038d418a0
Off-by-two in mpegts.c patch by (Wolfram Gloger <wmglo at dent dot med dot uni-muenchen dot de>)
michael
parents:
398
diff
changeset
|
1441 buf++; |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1442 len--; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1443 } else { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1444 handle_packet(ts, buf); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1445 buf += TS_PACKET_SIZE; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1446 len -= TS_PACKET_SIZE; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1447 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1448 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1449 return len1 - len; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1450 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1451 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1452 void mpegts_parse_close(MpegTSContext *ts) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1453 { |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1454 int i; |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1455 |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1456 for(i=0;i<NB_PID_MAX;i++) |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1457 av_free(ts->pids[i]); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1458 av_free(ts); |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1459 } |
|
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1460 |
| 1167 | 1461 AVInputFormat mpegts_demuxer = { |
| 0 | 1462 "mpegts", |
| 1463 "MPEG2 transport stream format", | |
| 1464 sizeof(MpegTSContext), | |
| 1465 mpegts_probe, | |
| 1466 mpegts_read_header, | |
| 1467 mpegts_read_packet, | |
| 1468 mpegts_read_close, | |
| 474 | 1469 read_seek, |
|
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1470 mpegts_get_pcr, |
|
292
155ce13f1033
mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents:
283
diff
changeset
|
1471 .flags = AVFMT_SHOW_IDS, |
| 0 | 1472 }; |
|
2108
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1473 |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1474 AVInputFormat mpegtsraw_demuxer = { |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1475 "mpegtsraw", |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1476 "MPEG2 raw transport stream format", |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1477 sizeof(MpegTSContext), |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1478 mpegts_probe, |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1479 mpegts_read_header, |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1480 mpegts_raw_read_packet, |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1481 mpegts_read_close, |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1482 read_seek, |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1483 mpegts_get_pcr, |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1484 .flags = AVFMT_SHOW_IDS, |
|
31619b03d1ce
split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents:
2101
diff
changeset
|
1485 }; |
