annotate mpegts.c @ 6193:da9998b48dff libavformat

rtpdec: Malloc the fmtp value buffer This allows very large value strings, needed for xiph extradata. Patch by Josh Allmann, joshua dot allmann at gmail
author mstorsjo
date Mon, 28 Jun 2010 20:27:25 +0000
parents 86f5c95d5ca6
children fa244b4fe683
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4201
diff changeset
3 * Copyright (c) 2002-2003 Fabrice Bellard
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3278
diff changeset
21
4962
66a7afa20cc7 move DEBUG define before include to get dprintf
bcoudurier
parents: 4868
diff changeset
22 //#define DEBUG
66a7afa20cc7 move DEBUG define before include to get dprintf
bcoudurier
parents: 4868
diff changeset
23 //#define DEBUG_SEEK
5162
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
24 //#define USE_SYNCPOINT_SEARCH
4962
66a7afa20cc7 move DEBUG define before include to get dprintf
bcoudurier
parents: 4868
diff changeset
25
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3278
diff changeset
26 #include "libavutil/crc.h"
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 4087
diff changeset
27 #include "libavutil/intreadwrite.h"
4860
d14d1f5f4eb4 simplify registration descriptor parsing with bytestream get functions
bcoudurier
parents: 4859
diff changeset
28 #include "libavcodec/bytestream.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 #include "avformat.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
30 #include "mpegts.h"
4062
297c1d6f9c5e Add necessary header for av_set_program_name and av_program_add_stream_index.
diego
parents: 4059
diff changeset
31 #include "internal.h"
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
32 #include "seek.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
33
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
34 /* 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
35 #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
36
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
37 /* 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
38 synchronisation is lost */
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
39 #define MAX_RESYNC_SIZE 65536
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
40
4963
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
41 #define MAX_PES_PAYLOAD 200*1024
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
42
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
43 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
44 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
45 MPEGTS_SECTION,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47
2236
117edddfce20 update SectionCallback and PESCallback typedefs to match functions
mru
parents: 2222
diff changeset
48 typedef struct MpegTSFilter MpegTSFilter;
117edddfce20 update SectionCallback and PESCallback typedefs to match functions
mru
parents: 2222
diff changeset
49
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
50 typedef int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
51
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
52 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
53 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
54 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
55 } MpegTSPESFilter;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
56
2236
117edddfce20 update SectionCallback and PESCallback typedefs to match functions
mru
parents: 2222
diff changeset
57 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
58
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
59 typedef void SetServiceCallback(void *opaque, int ret);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
61 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
62 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
63 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
64 uint8_t *section_buf;
3553
c3b9334f46ae One-bit bitfields should probably be unsigned. Unfortunately, it is left
takis
parents: 3487
diff changeset
65 unsigned int check_crc:1;
c3b9334f46ae One-bit bitfields should probably be unsigned. Unfortunately, it is left
takis
parents: 3487
diff changeset
66 unsigned int end_of_section_reached: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
67 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
68 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
69 } MpegTSSectionFilter;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
70
2236
117edddfce20 update SectionCallback and PESCallback typedefs to match functions
mru
parents: 2222
diff changeset
71 struct MpegTSFilter {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72 int pid;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 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
74 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
75 union {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
76 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
77 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
78 } u;
2236
117edddfce20 update SectionCallback and PESCallback typedefs to match functions
mru
parents: 2222
diff changeset
79 };
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
80
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
81 #define MAX_PIDS_PER_PROGRAM 64
4087
950dc8531665 mpegts: replace Program_t typedef with "struct Program"
mru
parents: 4062
diff changeset
82 struct Program {
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
83 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
84 unsigned int nb_pids;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
85 unsigned int pids[MAX_PIDS_PER_PROGRAM];
4087
950dc8531665 mpegts: replace Program_t typedef with "struct Program"
mru
parents: 4062
diff changeset
86 };
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
87
5620
0bbfce7dc2dc Fix build
mru
parents: 5619
diff changeset
88 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
89 /* 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
90 AVFormatContext *stream;
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
91 /** 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
92 int raw_packet_size;
3240
78153a85dccc Ensure that the timestamp reading code used for seeking chooses a position
michael
parents: 3226
diff changeset
93
78153a85dccc Ensure that the timestamp reading code used for seeking chooses a position
michael
parents: 3226
diff changeset
94 int pos47;
78153a85dccc Ensure that the timestamp reading code used for seeking chooses a position
michael
parents: 3226
diff changeset
95
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
96 /** 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
97 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
98
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
99 /** 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
100 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
101
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
102 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
103 int pcr_incr; /**< used to estimate the exact PCR */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
104
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
105 /* 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
106 /** stop parsing loop */
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
107 int stop_parse;
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
108 /** 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
109 AVPacket *pkt;
4963
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
110 /** to detect seek */
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
111 int64_t last_pos;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
112
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
113 /******************************************/
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
114 /* 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
115 /* scan context */
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
116 /** 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
117 unsigned int nb_prg;
4087
950dc8531665 mpegts: replace Program_t typedef with "struct Program"
mru
parents: 4062
diff changeset
118 struct Program *prg;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
119
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
120
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
121 /** 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
122 MpegTSFilter *pids[NB_PID_MAX];
5620
0bbfce7dc2dc Fix build
mru
parents: 5619
diff changeset
123 };
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124
2133
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
125 /* TS stream handling */
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 enum MpegTSState {
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
128 MPEGTS_HEADER = 0,
5000
e57ded024980 do not parse full header for private streams
bcoudurier
parents: 4999
diff changeset
129 MPEGTS_PESHEADER,
2133
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
130 MPEGTS_PESHEADER_FILL,
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
131 MPEGTS_PAYLOAD,
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
132 MPEGTS_SKIP,
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
133 };
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
134
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
135 /* enough for PES header + length */
5000
e57ded024980 do not parse full header for private streams
bcoudurier
parents: 4999
diff changeset
136 #define PES_START_SIZE 6
e57ded024980 do not parse full header for private streams
bcoudurier
parents: 4999
diff changeset
137 #define PES_HEADER_SIZE 9
2133
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
138 #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
139
5542
b0818d132889 remove useless type declarations
bcoudurier
parents: 5358
diff changeset
140 typedef struct PESContext {
2133
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
141 int pid;
2157
0103a8479df5 proper per stream pcr_pid support by (Wolfram Gloger wmglo dent.med.uni-muenchen@de )
michael
parents: 2146
diff changeset
142 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
143 int stream_type;
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
144 MpegTSContext *ts;
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
145 AVFormatContext *stream;
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
146 AVStream *st;
5262
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
147 AVStream *sub_st; /**< stream for the embedded AC3 stream in HDMV TrueHD */
2133
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
148 enum MpegTSState state;
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
149 /* used to get the format */
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
150 int data_index;
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
151 int total_size;
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
152 int pes_header_size;
5262
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
153 int extended_stream_id;
2133
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
154 int64_t pts, dts;
4615
12a7cd9178dd Change TS seeking so it returns position/timestamp of a key frame.
cehoyos
parents: 4427
diff changeset
155 int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */
2133
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
156 uint8_t header[MAX_PES_HEADER_SIZE];
4963
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
157 uint8_t *buffer;
5542
b0818d132889 remove useless type declarations
bcoudurier
parents: 5358
diff changeset
158 } PESContext;
2133
2b2f5fc314e0 move structs and enums to top of file so they can be used
michael
parents: 2132
diff changeset
159
2555
c226029c8df4 loosen dependencies over allformats.h
aurel
parents: 2274
diff changeset
160 extern AVInputFormat mpegts_demuxer;
c226029c8df4 loosen dependencies over allformats.h
aurel
parents: 2274
diff changeset
161
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
162 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
163 {
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
164 int i;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
165
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
166 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
167 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
168 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
169 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
170
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
171 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
172 {
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
173 av_freep(&ts->prg);
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
174 ts->nb_prg=0;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
175 }
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 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
178 {
4087
950dc8531665 mpegts: replace Program_t typedef with "struct Program"
mru
parents: 4062
diff changeset
179 struct Program *p;
950dc8531665 mpegts: replace Program_t typedef with "struct Program"
mru
parents: 4062
diff changeset
180 void *tmp = av_realloc(ts->prg, (ts->nb_prg+1)*sizeof(struct Program));
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
181 if(!tmp)
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
182 return;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
183 ts->prg = tmp;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
184 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
185 p->id = programid;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
186 p->nb_pids = 0;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
187 ts->nb_prg++;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
188 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
189
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
190 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
191 {
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
192 int i;
4087
950dc8531665 mpegts: replace Program_t typedef with "struct Program"
mru
parents: 4062
diff changeset
193 struct Program *p = NULL;
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
194 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
195 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
196 p = &ts->prg[i];
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
197 break;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
198 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
199 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
200 if(!p)
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
201 return;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
202
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
203 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
204 return;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
205 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
206 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
207
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
208 /**
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
209 * \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
210 * 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
211 * \param ts : - TS context
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
212 * \param pid : - pid
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
213 * \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
214 * 0 otherwise
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
215 */
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
216 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
217 {
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
218 int i, j, k;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
219 int used = 0, discarded = 0;
4087
950dc8531665 mpegts: replace Program_t typedef with "struct Program"
mru
parents: 4062
diff changeset
220 struct Program *p;
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
221 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
222 p = &ts->prg[i];
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
223 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
224 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
225 continue;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
226 //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
227 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
228 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
229 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
230 discarded++;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
231 else
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
232 used++;
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
233 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
234 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
235 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
236 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
237
3278
1de87c1b6a12 Remove unnecessary parentheses from return calls.
diego
parents: 3247
diff changeset
238 return !used && discarded;
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
239 }
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
240
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
241 /**
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
242 * 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
243 * 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
244 */
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
245 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
246 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
247 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
248 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
249 int len;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
250
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
251 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
252 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
253 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
254 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
255 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
256 } else {
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 (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
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 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
260 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
261 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
262 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
263 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
264 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
265
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
266 /* 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
267 if (tss->section_h_size == -1 && tss->section_index >= 3) {
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2159
diff changeset
268 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
269 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
270 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
271 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
272 }
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 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
275 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
276 if (!tss->check_crc ||
2893
c31c50af40c5 improve CRC API
aurel
parents: 2771
diff changeset
277 av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1,
c31c50af40c5 improve CRC API
aurel
parents: 2771
diff changeset
278 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
279 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
280 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
281 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
282
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1047
diff changeset
283 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
284 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
285 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
286
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
287 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
288 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
289 MpegTSSectionFilter *sec;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
290
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
291 dprintf(ts->stream, "Filter: pid=0x%x\n", pid);
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
292
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
293 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
294 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
295 filter = av_mallocz(sizeof(MpegTSFilter));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
296 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
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 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
299 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
300 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
301 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
302 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
303 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
304 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
305 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
306 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
307 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
308 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
309 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
310 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
311 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
312 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
313
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1047
diff changeset
314 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
315 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
316 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
317 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
318 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
319 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
320
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
321 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
322 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
323 filter = av_mallocz(sizeof(MpegTSFilter));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
324 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
325 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
326 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
327 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
328 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
329 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
330 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
331 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
332 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
333 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
334 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
335
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1047
diff changeset
336 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
337 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
338 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
339
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
340 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
341 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
342 av_freep(&filter->u.section_filter.section_buf);
4390
5b0645175029 Fix minor memory leak.
michael
parents: 4365
diff changeset
343 else if (filter->type == MPEGTS_PES) {
4963
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
344 PESContext *pes = filter->u.pes_filter.opaque;
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
345 av_freep(&pes->buffer);
4390
5b0645175029 Fix minor memory leak.
michael
parents: 4365
diff changeset
346 /* referenced private data will be freed later in
5b0645175029 Fix minor memory leak.
michael
parents: 4365
diff changeset
347 * av_close_input_stream */
5b0645175029 Fix minor memory leak.
michael
parents: 4365
diff changeset
348 if (!((PESContext *)filter->u.pes_filter.opaque)->st) {
5b0645175029 Fix minor memory leak.
michael
parents: 4365
diff changeset
349 av_freep(&filter->u.pes_filter.opaque);
5b0645175029 Fix minor memory leak.
michael
parents: 4365
diff changeset
350 }
5b0645175029 Fix minor memory leak.
michael
parents: 4365
diff changeset
351 }
342
0c1b489c96bf memleak patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 329
diff changeset
352
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
353 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
354 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
355 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
356
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
357 static int analyze(const uint8_t *buf, int size, int packet_size, int *index){
5143
f25bc340370b mpegts: change variable-length array to fixed length
mru
parents: 5140
diff changeset
358 int stat[TS_MAX_PACKET_SIZE];
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
359 int i;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
360 int x=0;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
361 int best_score=0;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
362
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
363 memset(stat, 0, packet_size*sizeof(int));
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
364
3589
f306b45cab7e MPEGTS: Improve probe function
mru
parents: 3553
diff changeset
365 for(x=i=0; i<size-3; i++){
f306b45cab7e MPEGTS: Improve probe function
mru
parents: 3553
diff changeset
366 if(buf[i] == 0x47 && !(buf[i+1] & 0x80) && (buf[i+3] & 0x30)){
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
367 stat[x]++;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
368 if(stat[x] > best_score){
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
369 best_score= stat[x];
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
370 if(index) *index= x;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
371 }
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
372 }
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
373
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
374 x++;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
375 if(x == packet_size) x= 0;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
376 }
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
377
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
378 return best_score;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
379 }
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
380
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 /* 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
382 static int get_packet_size(const uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383 {
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
384 int score, fec_score, dvhs_score;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
385
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
386 if (size < (TS_FEC_PACKET_SIZE * 5 + 1))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
388
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
389 score = analyze(buf, size, TS_PACKET_SIZE, NULL);
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
390 dvhs_score = analyze(buf, size, TS_DVHS_PACKET_SIZE, NULL);
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
391 fec_score= analyze(buf, size, TS_FEC_PACKET_SIZE, NULL);
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
392 // av_log(NULL, AV_LOG_DEBUG, "score: %d, dvhs_score: %d, fec_score: %d \n", score, dvhs_score, fec_score);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
393
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
394 if (score > fec_score && score > dvhs_score) return TS_PACKET_SIZE;
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
395 else if(dvhs_score > score && dvhs_score > fec_score) return TS_DVHS_PACKET_SIZE;
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
396 else if(score < fec_score && dvhs_score < fec_score) return TS_FEC_PACKET_SIZE;
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
397 else return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
400 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
401 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
402 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
403 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
404 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
405 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
406 } SectionHeader;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
407
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
408 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
409 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
410 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
411 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
412
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
413 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
414 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
415 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
416 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
417 *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
418 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
419 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
420
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
421 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
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 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
424 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
425
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
426 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
427 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
428 return -1;
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2159
diff changeset
429 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
430 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
431 *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
432 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
433 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
434
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
435 /* 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
436 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
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 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
439 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
440 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
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 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
443 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
444 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
445 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
446 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
447 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
448 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
449 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
450 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
451 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
452 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
453 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
454 *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
455 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
456 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
457
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
458 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
459 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
460 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
461 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
462
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
463 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
464 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
465 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
466 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
467 *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
468 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
469 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
470 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
471 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
472 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
473 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
474 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
475 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
476 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
477 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
478 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
479 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
480 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
481 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
482 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
483 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
484 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
485 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
486
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
487 typedef struct {
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
488 uint32_t stream_type;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
489 enum AVMediaType codec_type;
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
490 enum CodecID codec_id;
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
491 } StreamType;
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
492
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
493 static const StreamType ISO_types[] = {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
494 { 0x01, AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
495 { 0x02, AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
496 { 0x03, AVMEDIA_TYPE_AUDIO, CODEC_ID_MP3 },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
497 { 0x04, AVMEDIA_TYPE_AUDIO, CODEC_ID_MP3 },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
498 { 0x0f, AVMEDIA_TYPE_AUDIO, CODEC_ID_AAC },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
499 { 0x10, AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG4 },
5981
c1cd2ffd5cdc Disable LATM AAC in mpegts, this is not supported and produce too many
bcoudurier
parents: 5910
diff changeset
500 //{ 0x11, AVMEDIA_TYPE_AUDIO, CODEC_ID_AAC }, /* LATM syntax */
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
501 { 0x1b, AVMEDIA_TYPE_VIDEO, CODEC_ID_H264 },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
502 { 0xd1, AVMEDIA_TYPE_VIDEO, CODEC_ID_DIRAC },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
503 { 0xea, AVMEDIA_TYPE_VIDEO, CODEC_ID_VC1 },
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
504 { 0 },
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
505 };
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
506
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
507 static const StreamType HDMV_types[] = {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
508 { 0x80, AVMEDIA_TYPE_AUDIO, CODEC_ID_PCM_BLURAY },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
509 { 0x81, AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
510 { 0x82, AVMEDIA_TYPE_AUDIO, CODEC_ID_DTS },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
511 { 0x83, AVMEDIA_TYPE_AUDIO, CODEC_ID_TRUEHD },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
512 { 0x84, AVMEDIA_TYPE_AUDIO, CODEC_ID_EAC3 },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
513 { 0x90, AVMEDIA_TYPE_SUBTITLE, CODEC_ID_HDMV_PGS_SUBTITLE },
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
514 { 0 },
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
515 };
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
516
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
517 /* ATSC ? */
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
518 static const StreamType MISC_types[] = {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
519 { 0x81, AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
520 { 0x8a, AVMEDIA_TYPE_AUDIO, CODEC_ID_DTS },
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
521 { 0 },
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
522 };
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
523
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
524 static const StreamType REGD_types[] = {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
525 { MKTAG('d','r','a','c'), AVMEDIA_TYPE_VIDEO, CODEC_ID_DIRAC },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
526 { MKTAG('A','C','-','3'), AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 },
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
527 { 0 },
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
528 };
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
529
4982
dc217282e78b factorize
bcoudurier
parents: 4981
diff changeset
530 /* descriptor present */
dc217282e78b factorize
bcoudurier
parents: 4981
diff changeset
531 static const StreamType DESC_types[] = {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
532 { 0x6a, AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 }, /* AC-3 descriptor */
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
533 { 0x7a, AVMEDIA_TYPE_AUDIO, CODEC_ID_EAC3 }, /* E-AC-3 descriptor */
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
534 { 0x7b, AVMEDIA_TYPE_AUDIO, CODEC_ID_DTS },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
535 { 0x56, AVMEDIA_TYPE_SUBTITLE, CODEC_ID_DVB_TELETEXT },
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
536 { 0x59, AVMEDIA_TYPE_SUBTITLE, CODEC_ID_DVB_SUBTITLE }, /* subtitling descriptor */
5048
d44e963aaf1c add 0-termination in table, patch by Wolfram Gloger, wmglo at dent dot med dot uni-muenchen dot de
bcoudurier
parents: 5000
diff changeset
537 { 0 },
4982
dc217282e78b factorize
bcoudurier
parents: 4981
diff changeset
538 };
dc217282e78b factorize
bcoudurier
parents: 4981
diff changeset
539
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
540 static void mpegts_find_stream_type(AVStream *st,
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
541 uint32_t stream_type, const StreamType *types)
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
542 {
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
543 for (; types->stream_type; types++) {
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
544 if (stream_type == types->stream_type) {
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
545 st->codec->codec_type = types->codec_type;
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
546 st->codec->codec_id = types->codec_id;
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
547 return;
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
548 }
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
549 }
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
550 }
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
551
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
552 static int mpegts_set_stream_info(AVStream *st, PESContext *pes,
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
553 uint32_t stream_type, uint32_t prog_reg_desc)
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
554 {
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
555 av_set_pts_info(st, 33, 1, 90000);
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
556 st->priv_data = pes;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
557 st->codec->codec_type = AVMEDIA_TYPE_DATA;
5070
11e86c7bdc25 Only set CODEC_ID_PROBE when a packet from a stream having a PES header
bcoudurier
parents: 5048
diff changeset
558 st->codec->codec_id = CODEC_ID_NONE;
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
559 st->need_parsing = AVSTREAM_PARSE_FULL;
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
560 pes->st = st;
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
561 pes->stream_type = stream_type;
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
562
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
563 av_log(pes->stream, AV_LOG_DEBUG,
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
564 "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
565 st->index, pes->stream_type, pes->pid, (char*)&prog_reg_desc);
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
566
4988
ba58d4eaca58 set codec_tag to stream type, so user can deal with it
bcoudurier
parents: 4987
diff changeset
567 st->codec->codec_tag = pes->stream_type;
ba58d4eaca58 set codec_tag to stream type, so user can deal with it
bcoudurier
parents: 4987
diff changeset
568
4984
5bd0b3955904 reindent
bcoudurier
parents: 4983
diff changeset
569 mpegts_find_stream_type(st, pes->stream_type, ISO_types);
5bd0b3955904 reindent
bcoudurier
parents: 4983
diff changeset
570 if (prog_reg_desc == AV_RL32("HDMV") &&
5262
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
571 st->codec->codec_id == CODEC_ID_NONE) {
4984
5bd0b3955904 reindent
bcoudurier
parents: 4983
diff changeset
572 mpegts_find_stream_type(st, pes->stream_type, HDMV_types);
5262
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
573 if (pes->stream_type == 0x83) {
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
574 // HDMV TrueHD streams also contain an AC3 coded version of the
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
575 // audio track - add a second stream for this
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
576 AVStream *sub_st;
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
577 // priv_data cannot be shared between streams
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
578 PESContext *sub_pes = av_malloc(sizeof(*sub_pes));
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
579 if (!sub_pes)
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
580 return AVERROR(ENOMEM);
5262
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
581 memcpy(sub_pes, pes, sizeof(*sub_pes));
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
582
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
583 sub_st = av_new_stream(pes->stream, pes->pid);
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
584 if (!sub_st) {
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
585 av_free(sub_pes);
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
586 return AVERROR(ENOMEM);
5262
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
587 }
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
588
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
589 av_set_pts_info(sub_st, 33, 1, 90000);
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
590 sub_st->priv_data = sub_pes;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
591 sub_st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
5262
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
592 sub_st->codec->codec_id = CODEC_ID_AC3;
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
593 sub_st->need_parsing = AVSTREAM_PARSE_FULL;
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
594 sub_pes->sub_st = pes->sub_st = sub_st;
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
595 }
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
596 }
5981
c1cd2ffd5cdc Disable LATM AAC in mpegts, this is not supported and produce too many
bcoudurier
parents: 5910
diff changeset
597 if (pes->stream_type == 0x11)
c1cd2ffd5cdc Disable LATM AAC in mpegts, this is not supported and produce too many
bcoudurier
parents: 5910
diff changeset
598 av_log(pes->stream, AV_LOG_WARNING,
c1cd2ffd5cdc Disable LATM AAC in mpegts, this is not supported and produce too many
bcoudurier
parents: 5910
diff changeset
599 "AAC LATM not currently supported, patch welcome\n");
5070
11e86c7bdc25 Only set CODEC_ID_PROBE when a packet from a stream having a PES header
bcoudurier
parents: 5048
diff changeset
600 if (st->codec->codec_id == CODEC_ID_NONE)
4984
5bd0b3955904 reindent
bcoudurier
parents: 4983
diff changeset
601 mpegts_find_stream_type(st, pes->stream_type, MISC_types);
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
602
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
603 return 0;
4980
3f9b378936f2 move new_pes_av_stream to avoid forward declaration
bcoudurier
parents: 4979
diff changeset
604 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
605
5358
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
606 static int64_t get_pts(const uint8_t *p)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
607 {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
608 int64_t pts = (int64_t)((p[0] >> 1) & 0x07) << 30;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
609 pts |= (AV_RB16(p + 1) >> 1) << 15;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
610 pts |= AV_RB16(p + 3) >> 1;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
611 return pts;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
612 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
613
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
614 static void new_pes_packet(PESContext *pes, AVPacket *pkt)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
615 {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
616 av_init_packet(pkt);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
617
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
618 pkt->destruct = av_destruct_packet;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
619 pkt->data = pes->buffer;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
620 pkt->size = pes->data_index;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
621 memset(pkt->data+pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
622
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
623 // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
624 if (pes->sub_st && pes->stream_type == 0x83 && pes->extended_stream_id == 0x76)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
625 pkt->stream_index = pes->sub_st->index;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
626 else
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
627 pkt->stream_index = pes->st->index;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
628 pkt->pts = pes->pts;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
629 pkt->dts = pes->dts;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
630 /* store position of first TS packet of this PES packet */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
631 pkt->pos = pes->ts_packet_pos;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
632
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
633 /* reset pts values */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
634 pes->pts = AV_NOPTS_VALUE;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
635 pes->dts = AV_NOPTS_VALUE;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
636 pes->buffer = NULL;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
637 pes->data_index = 0;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
638 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
639
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
640 /* return non zero if a packet could be constructed */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
641 static int mpegts_push_data(MpegTSFilter *filter,
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
642 const uint8_t *buf, int buf_size, int is_start,
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
643 int64_t pos)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
644 {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
645 PESContext *pes = filter->u.pes_filter.opaque;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
646 MpegTSContext *ts = pes->ts;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
647 const uint8_t *p;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
648 int len, code;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
649
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
650 if(!ts->pkt)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
651 return 0;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
652
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
653 if (is_start) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
654 if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
655 new_pes_packet(pes, ts->pkt);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
656 ts->stop_parse = 1;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
657 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
658 pes->state = MPEGTS_HEADER;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
659 pes->data_index = 0;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
660 pes->ts_packet_pos = pos;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
661 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
662 p = buf;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
663 while (buf_size > 0) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
664 switch(pes->state) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
665 case MPEGTS_HEADER:
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
666 len = PES_START_SIZE - pes->data_index;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
667 if (len > buf_size)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
668 len = buf_size;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
669 memcpy(pes->header + pes->data_index, p, len);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
670 pes->data_index += len;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
671 p += len;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
672 buf_size -= len;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
673 if (pes->data_index == PES_START_SIZE) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
674 /* we got all the PES or section header. We can now
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
675 decide */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
676 #if 0
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
677 av_hex_dump_log(pes->stream, AV_LOG_DEBUG, pes->header, pes->data_index);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
678 #endif
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
679 if (pes->header[0] == 0x00 && pes->header[1] == 0x00 &&
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
680 pes->header[2] == 0x01) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
681 /* it must be an mpeg2 PES stream */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
682 code = pes->header[3] | 0x100;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
683 dprintf(pes->stream, "pid=%x pes_code=%#x\n", pes->pid, code);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
684
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
685 if ((!pes->st && pes->stream->nb_streams == MAX_STREAMS) ||
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
686 (pes->st && pes->st->discard == AVDISCARD_ALL) ||
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
687 code == 0x1be) /* padding_stream */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
688 goto skip;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
689
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
690 /* stream not present in PMT */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
691 if (!pes->st) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
692 pes->st = av_new_stream(ts->stream, pes->pid);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
693 if (!pes->st)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
694 return AVERROR(ENOMEM);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
695 mpegts_set_stream_info(pes->st, pes, 0, 0);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
696 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
697
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
698 pes->total_size = AV_RB16(pes->header + 4);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
699 /* NOTE: a zero total size means the PES size is
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
700 unbounded */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
701 if (!pes->total_size)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
702 pes->total_size = MAX_PES_PAYLOAD;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
703
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
704 /* allocate pes buffer */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
705 pes->buffer = av_malloc(pes->total_size+FF_INPUT_BUFFER_PADDING_SIZE);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
706 if (!pes->buffer)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
707 return AVERROR(ENOMEM);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
708
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
709 if (code != 0x1bc && code != 0x1bf && /* program_stream_map, private_stream_2 */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
710 code != 0x1f0 && code != 0x1f1 && /* ECM, EMM */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
711 code != 0x1ff && code != 0x1f2 && /* program_stream_directory, DSMCC_stream */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
712 code != 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
713 pes->state = MPEGTS_PESHEADER;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
714 if (pes->st->codec->codec_id == CODEC_ID_NONE) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
715 dprintf(pes->stream, "pid=%x stream_type=%x probing\n",
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
716 pes->pid, pes->stream_type);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
717 pes->st->codec->codec_id = CODEC_ID_PROBE;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
718 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
719 } else {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
720 pes->state = MPEGTS_PAYLOAD;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
721 pes->data_index = 0;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
722 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
723 } else {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
724 /* otherwise, it should be a table */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
725 /* skip packet */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
726 skip:
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
727 pes->state = MPEGTS_SKIP;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
728 continue;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
729 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
730 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
731 break;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
732 /**********************************************/
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
733 /* PES packing parsing */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
734 case MPEGTS_PESHEADER:
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
735 len = PES_HEADER_SIZE - pes->data_index;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
736 if (len < 0)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
737 return -1;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
738 if (len > buf_size)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
739 len = buf_size;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
740 memcpy(pes->header + pes->data_index, p, len);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
741 pes->data_index += len;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
742 p += len;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
743 buf_size -= len;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
744 if (pes->data_index == PES_HEADER_SIZE) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
745 pes->pes_header_size = pes->header[8] + 9;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
746 pes->state = MPEGTS_PESHEADER_FILL;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
747 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
748 break;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
749 case MPEGTS_PESHEADER_FILL:
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
750 len = pes->pes_header_size - pes->data_index;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
751 if (len < 0)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
752 return -1;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
753 if (len > buf_size)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
754 len = buf_size;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
755 memcpy(pes->header + pes->data_index, p, len);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
756 pes->data_index += len;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
757 p += len;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
758 buf_size -= len;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
759 if (pes->data_index == pes->pes_header_size) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
760 const uint8_t *r;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
761 unsigned int flags, pes_ext, skip;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
762
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
763 flags = pes->header[7];
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
764 r = pes->header + 9;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
765 pes->pts = AV_NOPTS_VALUE;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
766 pes->dts = AV_NOPTS_VALUE;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
767 if ((flags & 0xc0) == 0x80) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
768 pes->dts = pes->pts = get_pts(r);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
769 r += 5;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
770 } else if ((flags & 0xc0) == 0xc0) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
771 pes->pts = get_pts(r);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
772 r += 5;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
773 pes->dts = get_pts(r);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
774 r += 5;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
775 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
776 pes->extended_stream_id = -1;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
777 if (flags & 0x01) { /* PES extension */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
778 pes_ext = *r++;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
779 /* Skip PES private data, program packet sequence counter and P-STD buffer */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
780 skip = (pes_ext >> 4) & 0xb;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
781 skip += skip & 0x9;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
782 r += skip;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
783 if ((pes_ext & 0x41) == 0x01 &&
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
784 (r + 2) <= (pes->header + pes->pes_header_size)) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
785 /* PES extension 2 */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
786 if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
787 pes->extended_stream_id = r[1];
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
788 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
789 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
790
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
791 /* we got the full header. We parse it and get the payload */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
792 pes->state = MPEGTS_PAYLOAD;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
793 pes->data_index = 0;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
794 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
795 break;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
796 case MPEGTS_PAYLOAD:
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
797 if (buf_size > 0 && pes->buffer) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
798 if (pes->data_index+buf_size > pes->total_size) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
799 new_pes_packet(pes, ts->pkt);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
800 pes->total_size = MAX_PES_PAYLOAD;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
801 pes->buffer = av_malloc(pes->total_size+FF_INPUT_BUFFER_PADDING_SIZE);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
802 if (!pes->buffer)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
803 return AVERROR(ENOMEM);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
804 ts->stop_parse = 1;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
805 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
806 memcpy(pes->buffer+pes->data_index, p, buf_size);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
807 pes->data_index += buf_size;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
808 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
809 buf_size = 0;
6006
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
810 /* emit complete packets with known packet size
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
811 * decreases demuxer delay for infrequent packets like subtitles from
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
812 * a couple of seconds to milliseconds for properly muxed files.
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
813 * total_size is the number of bytes following pes_packet_length
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
814 * in the pes header, i.e. not counting the first 6 bytes */
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
815 if (pes->total_size < MAX_PES_PAYLOAD &&
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
816 pes->pes_header_size + pes->data_index == pes->total_size + 6) {
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
817 ts->stop_parse = 1;
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
818 new_pes_packet(pes, ts->pkt);
86f5c95d5ca6 In ts demuxer, output pes packet as soon as they are complete.
bcoudurier
parents: 5982
diff changeset
819 }
5358
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
820 break;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
821 case MPEGTS_SKIP:
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
822 buf_size = 0;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
823 break;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
824 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
825 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
826
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
827 return 0;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
828 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
829
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
830 static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
831 {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
832 MpegTSFilter *tss;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
833 PESContext *pes;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
834
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
835 /* if no pid found, then add a pid context */
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
836 pes = av_mallocz(sizeof(PESContext));
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
837 if (!pes)
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
838 return 0;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
839 pes->ts = ts;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
840 pes->stream = ts->stream;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
841 pes->pid = pid;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
842 pes->pcr_pid = pcr_pid;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
843 pes->state = MPEGTS_SKIP;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
844 pes->pts = AV_NOPTS_VALUE;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
845 pes->dts = AV_NOPTS_VALUE;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
846 tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
847 if (!tss) {
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
848 av_free(pes);
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
849 return 0;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
850 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
851 return pes;
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
852 }
39a8e1dd9f9d move code to avoid forward declaration
bcoudurier
parents: 5357
diff changeset
853
2132
c8e642dd5f9c passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents: 2129
diff changeset
854 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
855 {
2132
c8e642dd5f9c passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents: 2129
diff changeset
856 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
857 SectionHeader h1, *h = &h1;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
858 PESContext *pes;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
859 AVStream *st;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
860 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
861 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
862 int desc_list_len, desc_len, desc_tag;
4983
4b6537814493 remove no longer needed init
bcoudurier
parents: 4982
diff changeset
863 int comp_page, anc_page;
4b6537814493 remove no longer needed init
bcoudurier
parents: 4982
diff changeset
864 char language[4];
4978
deaa9053dc97 rework stream type and codec identification
bcoudurier
parents: 4977
diff changeset
865 uint32_t prog_reg_desc = 0; /* registration descriptor */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
866
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
867 #ifdef DEBUG
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
868 dprintf(ts->stream, "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
869 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
870 #endif
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
871
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 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
873 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
874 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
875 return;
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
876
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
877 dprintf(ts->stream, "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
878 h->id, h->sec_num, h->last_sec_num);
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
879
2134
16cf48c9af53 dont rescan for information on each pid, but rather do it just once by
michael
parents: 2133
diff changeset
880 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
881 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
882
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
883 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
884 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
885 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
886 return;
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
887 add_pid_to_pmt(ts, h->id, pcr_pid);
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
888
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
889 dprintf(ts->stream, "pcr_pid=0x%x\n", pcr_pid);
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
890
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
891 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
892 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
893 return;
3059
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
894 while(program_info_length >= 2) {
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
895 uint8_t tag, len;
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
896 tag = get8(&p, p_end);
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
897 len = get8(&p, p_end);
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
898 if(len > program_info_length - 2)
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
899 //something else is broken, exit the program_descriptors_loop
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
900 break;
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
901 program_info_length -= len + 2;
4979
c6796179d3fa remove defines
bcoudurier
parents: 4978
diff changeset
902 if(tag == 0x05 && len >= 4) { // registration descriptor
4978
deaa9053dc97 rework stream type and codec identification
bcoudurier
parents: 4977
diff changeset
903 prog_reg_desc = bytestream_get_le32(&p);
3059
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
904 len -= 4;
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
905 }
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
906 p += len;
f982a5a75e40 treat stream_type==0x82 as AUDIO_DTS when the program has a REGISTRATION_DESCRIPTOR with the value HDMV; approved by Mans
nicodvb
parents: 2893
diff changeset
907 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
908 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
909 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
910 return;
5116
c4e22fecdcaa Stop parsing in read_header only after finding pmt, and
bcoudurier
parents: 5070
diff changeset
911
c4e22fecdcaa Stop parsing in read_header only after finding pmt, and
bcoudurier
parents: 5070
diff changeset
912 // stop parsing after pmt, we found header
c4e22fecdcaa Stop parsing in read_header only after finding pmt, and
bcoudurier
parents: 5070
diff changeset
913 if (!ts->stream->nb_streams)
c4e22fecdcaa Stop parsing in read_header only after finding pmt, and
bcoudurier
parents: 5070
diff changeset
914 ts->stop_parse = 1;
c4e22fecdcaa Stop parsing in read_header only after finding pmt, and
bcoudurier
parents: 5070
diff changeset
915
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
916 for(;;) {
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
917 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
918 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
919 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
920 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
921 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
922 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
923 break;
4981
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
924
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
925 /* now create ffmpeg stream */
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
926 if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
927 pes = ts->pids[pid]->u.pes_filter.opaque;
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
928 st = pes->st;
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
929 } else {
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
930 if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
931 pes = add_pes_stream(ts, pid, pcr_pid);
4981
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
932 if (pes)
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
933 st = av_new_stream(pes->stream, pes->pid);
4981
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
934 }
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
935
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
936 if (!st)
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
937 return;
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
938
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
939 if (!pes->stream_type)
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
940 mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
941
4981
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
942 add_pid_to_pmt(ts, h->id, pid);
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
943
5852
36b46032fad5 rename av_program_add_stream_index to ff_program_add_stream_index
aurel
parents: 5783
diff changeset
944 ff_program_add_stream_index(ts->stream, h->id, st->index);
4981
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
945
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
946 desc_list_len = get16(&p, p_end) & 0xfff;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
947 if (desc_list_len < 0)
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
948 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
949 desc_list_end = p + desc_list_len;
4859
0929b70d4407 Ok, ts demuxer is more complicated than I thought
bcoudurier
parents: 4858
diff changeset
950 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
951 break;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
952 for(;;) {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
953 desc_tag = get8(&p, desc_list_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
954 if (desc_tag < 0)
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
955 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
956 desc_len = get8(&p, desc_list_end);
4859
0929b70d4407 Ok, ts demuxer is more complicated than I thought
bcoudurier
parents: 4858
diff changeset
957 if (desc_len < 0)
0929b70d4407 Ok, ts demuxer is more complicated than I thought
bcoudurier
parents: 4858
diff changeset
958 break;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
959 desc_end = p + desc_len;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
960 if (desc_end > desc_list_end)
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
961 break;
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
962
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
963 dprintf(ts->stream, "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
964 desc_tag, desc_len);
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
965
5070
11e86c7bdc25 Only set CODEC_ID_PROBE when a packet from a stream having a PES header
bcoudurier
parents: 5048
diff changeset
966 if (st->codec->codec_id == CODEC_ID_NONE &&
4982
dc217282e78b factorize
bcoudurier
parents: 4981
diff changeset
967 stream_type == STREAM_TYPE_PRIVATE_DATA)
dc217282e78b factorize
bcoudurier
parents: 4981
diff changeset
968 mpegts_find_stream_type(st, desc_tag, DESC_types);
dc217282e78b factorize
bcoudurier
parents: 4981
diff changeset
969
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
970 switch(desc_tag) {
5337
9a3338ab7453 Support demuxing teletext in DVB streams.
cehoyos
parents: 5304
diff changeset
971 case 0x56: /* DVB teletext descriptor */
9a3338ab7453 Support demuxing teletext in DVB streams.
cehoyos
parents: 5304
diff changeset
972 language[0] = get8(&p, desc_end);
9a3338ab7453 Support demuxing teletext in DVB streams.
cehoyos
parents: 5304
diff changeset
973 language[1] = get8(&p, desc_end);
9a3338ab7453 Support demuxing teletext in DVB streams.
cehoyos
parents: 5304
diff changeset
974 language[2] = get8(&p, desc_end);
9a3338ab7453 Support demuxing teletext in DVB streams.
cehoyos
parents: 5304
diff changeset
975 language[3] = 0;
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5981
diff changeset
976 av_metadata_set2(&st->metadata, "language", language, 0);
5337
9a3338ab7453 Support demuxing teletext in DVB streams.
cehoyos
parents: 5304
diff changeset
977 break;
4979
c6796179d3fa remove defines
bcoudurier
parents: 4978
diff changeset
978 case 0x59: /* subtitling descriptor */
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
979 language[0] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
980 language[1] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
981 language[2] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
982 language[3] = 0;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
983 get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
984 comp_page = get16(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
985 anc_page = get16(&p, desc_end);
4981
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
986 st->codec->sub_id = (anc_page << 16) | comp_page;
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5981
diff changeset
987 av_metadata_set2(&st->metadata, "language", language, 0);
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
988 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
989 case 0x0a: /* ISO 639 language descriptor */
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
990 language[0] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
991 language[1] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
992 language[2] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
993 language[3] = 0;
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5981
diff changeset
994 av_metadata_set2(&st->metadata, "language", language, 0);
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
995 break;
4979
c6796179d3fa remove defines
bcoudurier
parents: 4978
diff changeset
996 case 0x05: /* registration descriptor */
4987
62bf51efe6ec set codec_tag to registration descriptor if present
bcoudurier
parents: 4986
diff changeset
997 st->codec->codec_tag = bytestream_get_le32(&p);
4995
de114ffe75df print reg desc in a more friendly way
bcoudurier
parents: 4994
diff changeset
998 dprintf(ts->stream, "reg_desc=%.4s\n", (char*)&st->codec->codec_tag);
5070
11e86c7bdc25 Only set CODEC_ID_PROBE when a packet from a stream having a PES header
bcoudurier
parents: 5048
diff changeset
999 if (st->codec->codec_id == CODEC_ID_NONE &&
4981
5b710f5c8a53 simplify and merge
bcoudurier
parents: 4980
diff changeset
1000 stream_type == STREAM_TYPE_PRIVATE_DATA)
4987
62bf51efe6ec set codec_tag to registration descriptor if present
bcoudurier
parents: 4986
diff changeset
1001 mpegts_find_stream_type(st, st->codec->codec_tag, REGD_types);
4860
d14d1f5f4eb4 simplify registration descriptor parsing with bytestream get functions
bcoudurier
parents: 4859
diff changeset
1002 break;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1003 default:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1004 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1005 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1006 p = desc_end;
5262
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
1007
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
1008 if (prog_reg_desc == AV_RL32("HDMV") && stream_type == 0x83 && pes->sub_st) {
5852
36b46032fad5 rename av_program_add_stream_index to ff_program_add_stream_index
aurel
parents: 5783
diff changeset
1009 ff_program_add_stream_index(ts->stream, h->id, pes->sub_st->index);
5262
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
1010 pes->sub_st->codec->codec_tag = st->codec->codec_tag;
a2289abc9e23 Allow the combined TrueHD/AC3 tracks on Blu-Ray discs to be demuxed as two separate streams.
cehoyos
parents: 5175
diff changeset
1011 }
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1012 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1013 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
1014 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1015 /* all parameters are there */
2132
c8e642dd5f9c passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents: 2129
diff changeset
1016 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
1017 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1018
2132
c8e642dd5f9c passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents: 2129
diff changeset
1019 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
1020 {
2132
c8e642dd5f9c passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents: 2129
diff changeset
1021 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
1022 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
1023 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
1024 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
1025
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1026 #ifdef DEBUG
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1027 dprintf(ts->stream, "PAT:\n");
1908
174083eafc6c Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents: 1787
diff changeset
1028 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
1029 #endif
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_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
1031 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
1032 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
1033 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1034 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
1035 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1036
2575
06d31789d338 added structures and code to keep track of pids<->programs mapping: it's needed
nicodvb
parents: 2574
diff changeset
1037 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
1038 for(;;) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1039 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
1040 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
1041 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1042 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
1043 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
1044 break;
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1045
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1046 dprintf(ts->stream, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1047
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 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
1049 /* 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
1050 } else {
2574
9e51e62f5bdd replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents: 2555
diff changeset
1051 av_new_program(ts->stream, sid);
2137
f68b81777ac6 fix indention
michael
parents: 2136
diff changeset
1052 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
1053 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
1054 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
1055 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
1056 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1057 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1058 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1059
2132
c8e642dd5f9c passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents: 2129
diff changeset
1060 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
1061 {
2132
c8e642dd5f9c passing MpegTSFilter to the filters instead of a random void *opaque
michael
parents: 2129
diff changeset
1062 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
1063 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
1064 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
1065 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
1066 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
1067
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1068 #ifdef DEBUG
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1069 dprintf(ts->stream, "SDT:\n");
1908
174083eafc6c Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents: 1787
diff changeset
1070 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
1071 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1072
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1073 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
1074 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
1075 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
1076 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1077 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
1078 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1079 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
1080 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
1081 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1082 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
1083 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
1084 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1085 for(;;) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1086 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
1087 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
1088 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1089 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
1090 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
1091 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1092 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
1093 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
1094 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1095 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
1096 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
1097 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1098 for(;;) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1099 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
1100 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
1101 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1102 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
1103 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
1104 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
1105 break;
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1106
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1107 dprintf(ts->stream, "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
1108 desc_tag, desc_len);
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1109
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1110 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
1111 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
1112 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
1113 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
1114 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1115 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
1116 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
1117 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1118 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
1119 if (name) {
9e51e62f5bdd replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents: 2555
diff changeset
1120 AVProgram *program = av_new_program(ts->stream, sid);
4427
4d45ef755d67 use new metadata API in mpegts demuxer
aurel
parents: 4390
diff changeset
1121 if(program) {
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5981
diff changeset
1122 av_metadata_set2(&program->metadata, "name", name, 0);
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5981
diff changeset
1123 av_metadata_set2(&program->metadata, "provider_name", provider_name, 0);
4427
4d45ef755d67 use new metadata API in mpegts demuxer
aurel
parents: 4390
diff changeset
1124 }
2574
9e51e62f5bdd replaced custom tracking of programs/services with calls to with av_new_program()
nicodvb
parents: 2555
diff changeset
1125 }
3247
8876618cea62 Fixing memleaks.
michael
parents: 3240
diff changeset
1126 av_free(name);
8876618cea62 Fixing memleaks.
michael
parents: 3240
diff changeset
1127 av_free(provider_name);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1128 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1129 default:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1130 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1131 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1132 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
1133 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1134 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
1135 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1136 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1137
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1138 /* handle one TS packet */
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1139 static int 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
1140 {
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1141 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
1142 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
1143 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
1144 const uint8_t *p, *p_end;
4615
12a7cd9178dd Change TS seeking so it returns position/timestamp of a key frame.
cehoyos
parents: 4427
diff changeset
1145 int64_t pos;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1146
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2159
diff changeset
1147 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
1148 if(pid && discard_pid(ts, pid))
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1149 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
1150 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
1151 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
1152 if (ts->auto_guess && tss == NULL && is_start) {
5357
3aca7ac4b059 Let pmt override stream info when encoutered later in the ts file.
bcoudurier
parents: 5356
diff changeset
1153 add_pes_stream(ts, pid, -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
1154 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
1155 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1156 if (!tss)
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1157 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
1158
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1159 /* 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
1160 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
1161 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
1162 tss->last_cc = cc;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1163
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1164 /* 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
1165 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
1166 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
1167 if (afc == 0) /* reserved value */
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1168 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
1169 if (afc == 2) /* adaptation field only */
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1170 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
1171 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
1172 /* 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
1173 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
1174 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1175 /* 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
1176 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
1177 if (p >= p_end)
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1178 return 0;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1179
4615
12a7cd9178dd Change TS seeking so it returns position/timestamp of a key frame.
cehoyos
parents: 4427
diff changeset
1180 pos = url_ftell(ts->stream->pb);
12a7cd9178dd Change TS seeking so it returns position/timestamp of a key frame.
cehoyos
parents: 4427
diff changeset
1181 ts->pos47= pos % ts->raw_packet_size;
3240
78153a85dccc Ensure that the timestamp reading code used for seeking chooses a position
michael
parents: 3226
diff changeset
1182
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1183 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
1184 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
1185 /* 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
1186 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
1187 if (p + len > p_end)
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1188 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
1189 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
1190 /* write remaining section bytes */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1191 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
1192 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
1193 /* 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
1194 if (!ts->pids[pid])
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1195 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
1196 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1197 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
1198 if (p < p_end) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1199 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
1200 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
1201 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1202 } else {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1203 if (cc_ok) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1204 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
1205 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
1206 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1207 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1208 } else {
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1209 int ret;
4615
12a7cd9178dd Change TS seeking so it returns position/timestamp of a key frame.
cehoyos
parents: 4427
diff changeset
1210 // Note: The position here points actually behind the current packet.
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1211 if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1212 pos - ts->raw_packet_size)) < 0)
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1213 return 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
1214 }
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1215
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1216 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
1217 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1218
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
1219 /* 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
1220 get_packet_size() ?) */
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1221 static int mpegts_resync(AVFormatContext *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
1222 {
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1223 ByteIOContext *pb = s->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
1224 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
1225
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
1226 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
1227 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
1228 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
1229 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
1230 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
1231 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
1232 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
1233 }
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
1234 }
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1235 av_log(s, AV_LOG_ERROR, "max resync size reached, could not find sync byte\n");
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
1236 /* 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
1237 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
1238 }
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
1239
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1240 /* return -1 if error or EOF. Return 0 if OK. */
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1241 static int read_packet(AVFormatContext *s, 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
1242 {
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1243 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
1244 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
1245
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1246 for(;;) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1247 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
1248 if (len != TS_PACKET_SIZE)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2247
diff changeset
1249 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
1250 /* 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
1251 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
1252 /* 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
1253 url_fseek(pb, -TS_PACKET_SIZE, SEEK_CUR);
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1254 if (mpegts_resync(s) < 0)
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1255 return AVERROR(EAGAIN);
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1256 else
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1257 continue;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1258 } else {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1259 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
1260 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
1261 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
1262 break;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1263 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1264 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1265 return 0;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1266 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1267
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1268 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
1269 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1270 AVFormatContext *s = ts->stream;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1271 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
1272 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
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 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
1275 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
1276 for(;;) {
2134
16cf48c9af53 dont rescan for information on each pid, but rather do it just once by
michael
parents: 2133
diff changeset
1277 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
1278 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1279 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
1280 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
1281 break;
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1282 ret = read_packet(s, 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
1283 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
1284 return ret;
4966
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1285 ret = handle_packet(ts, packet);
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1286 if (ret != 0)
a6c807c154b1 return error in mpegts_push_data and propagate it
bcoudurier
parents: 4965
diff changeset
1287 return 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
1288 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1289 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
1290 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1291
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1292 static int mpegts_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1293 {
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
1294 #if 1
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1295 const int size= p->buf_size;
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
1296 int score, fec_score, dvhs_score;
4365
85ba93088fb5 Fix probe & demuxing of Topfield 58XXPVR and 68XXPVR (topfield.rec)
michael
parents: 4280
diff changeset
1297 int check_count= size / TS_FEC_PACKET_SIZE;
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1298 #define CHECK_COUNT 10
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1299
4365
85ba93088fb5 Fix probe & demuxing of Topfield 58XXPVR and 68XXPVR (topfield.rec)
michael
parents: 4280
diff changeset
1300 if (check_count < CHECK_COUNT)
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1301 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1302
4365
85ba93088fb5 Fix probe & demuxing of Topfield 58XXPVR and 68XXPVR (topfield.rec)
michael
parents: 4280
diff changeset
1303 score = analyze(p->buf, TS_PACKET_SIZE *check_count, TS_PACKET_SIZE , NULL)*CHECK_COUNT/check_count;
85ba93088fb5 Fix probe & demuxing of Topfield 58XXPVR and 68XXPVR (topfield.rec)
michael
parents: 4280
diff changeset
1304 dvhs_score= analyze(p->buf, TS_DVHS_PACKET_SIZE*check_count, TS_DVHS_PACKET_SIZE, NULL)*CHECK_COUNT/check_count;
85ba93088fb5 Fix probe & demuxing of Topfield 58XXPVR and 68XXPVR (topfield.rec)
michael
parents: 4280
diff changeset
1305 fec_score = analyze(p->buf, TS_FEC_PACKET_SIZE *check_count, TS_FEC_PACKET_SIZE , NULL)*CHECK_COUNT/check_count;
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
1306 // av_log(NULL, AV_LOG_DEBUG, "score: %d, dvhs_score: %d, fec_score: %d \n", score, dvhs_score, fec_score);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1307
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1308 // we need a clear definition for the returned score otherwise things will become messy sooner or later
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
1309 if (score > fec_score && score > dvhs_score && score > 6) return AVPROBE_SCORE_MAX + score - CHECK_COUNT;
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
1310 else if(dvhs_score > score && dvhs_score > fec_score && dvhs_score > 6) return AVPROBE_SCORE_MAX + dvhs_score - CHECK_COUNT;
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1311 else if( fec_score > 6) return AVPROBE_SCORE_MAX + fec_score - CHECK_COUNT;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1312 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
1313 #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
1314 /* only use the extension for safer guess */
5783
ca28eb609756 Replace last occurrence of the deprecated match_ext() with
stefano
parents: 5620
diff changeset
1315 if (av_match_ext(p->filename, "ts"))
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
1316 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
1317 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
1318 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
1319 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1320 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1321
3968
bf1b4748cd2e spelling cosmetics
diego
parents: 3967
diff changeset
1322 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1323 (-1) if not available */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1324 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
1325 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
1326 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1327 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
1328 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
1329 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
1330
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1331 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
1332 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
1333 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1334 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
1335 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
1336 p++;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1337 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
1338 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1339 flags = *p++;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1340 len--;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1341 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
1342 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1343 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
1344 return -1;
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2159
diff changeset
1345 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
1346 *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
1347 *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
1348 return 0;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1349 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1350
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1351 static int mpegts_read_header(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1352 AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1353 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1354 MpegTSContext *ts = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2761
diff changeset
1355 ByteIOContext *pb = s->pb;
4365
85ba93088fb5 Fix probe & demuxing of Topfield 58XXPVR and 68XXPVR (topfield.rec)
michael
parents: 4280
diff changeset
1356 uint8_t buf[5*1024];
2135
9387d2dce86f unused variables
michael
parents: 2134
diff changeset
1357 int len;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 0
diff changeset
1358 int64_t pos;
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1359
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1360 if (ap) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1361 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
1362 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
1363 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
1364 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
1365 }
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1366 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1367
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1368 /* read the first 1024 bytes to get packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1369 pos = url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1370 len = get_buffer(pb, buf, sizeof(buf));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1371 if (len != sizeof(buf))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1372 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1373 ts->raw_packet_size = get_packet_size(buf, sizeof(buf));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1374 if (ts->raw_packet_size <= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1375 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
1376 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
1377 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
1378
2108
31619b03d1ce split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents: 2101
diff changeset
1379 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
1380 /* 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
1381
2126
d21480a68906 Indentation
benoit
parents: 2113
diff changeset
1382 /* first do a scaning to get all the services */
d21480a68906 Indentation
benoit
parents: 2113
diff changeset
1383 url_fseek(pb, pos, SEEK_SET);
4868
8ee3deef8b44 remove useless wrapper
bcoudurier
parents: 4866
diff changeset
1384
8ee3deef8b44 remove useless wrapper
bcoudurier
parents: 4866
diff changeset
1385 mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
2126
d21480a68906 Indentation
benoit
parents: 2113
diff changeset
1386
4866
ea96a592b4a3 remove useless wrapper
bcoudurier
parents: 4862
diff changeset
1387 mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1388
5304
ca4d9e153f56 handle_packets takes number of packets as arg, avoid reading too much
bcoudurier
parents: 5303
diff changeset
1389 handle_packets(ts, s->probesize / ts->raw_packet_size);
2126
d21480a68906 Indentation
benoit
parents: 2113
diff changeset
1390 /* if could not find service, enable auto_guess */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1391
2126
d21480a68906 Indentation
benoit
parents: 2113
diff changeset
1392 ts->auto_guess = 1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1393
4862
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1394 dprintf(ts->stream, "tuning done\n");
7517f820d260 replace DEBUG_SI with DEBUG and use dprintf
bcoudurier
parents: 4861
diff changeset
1395
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1396 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
1397 } else {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1398 AVStream *st;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1399 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
1400 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
1401 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
1402 uint8_t packet[TS_PACKET_SIZE];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1403
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1404 /* only read packets */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1405
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1406 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
1407 if (!st)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1408 goto fail;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 444
diff changeset
1409 av_set_pts_info(st, 60, 1, 27000000);
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5852
diff changeset
1410 st->codec->codec_type = AVMEDIA_TYPE_DATA;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 819
diff changeset
1411 st->codec->codec_id = CODEC_ID_MPEG2TS;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1412
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1413 /* 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
1414 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
1415 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
1416 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
1417 for(;;) {
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1418 ret = read_packet(s, 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
1419 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
1420 return -1;
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2159
diff changeset
1421 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
1422 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
1423 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
1424 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
1425 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
1426 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
1427 nb_pcrs++;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1428 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
1429 break;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1430 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1431 nb_packets++;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1432 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1433
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1434 /* 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
1435 /* 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
1436 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
1437 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
1438 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
1439 st->codec->bit_rate = s->bit_rate;
743
af4e24d6310c switch to native time bases
michael
parents: 675
diff changeset
1440 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
1441 #if 0
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
1442 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
1443 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
1444 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1445 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1446
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1447 url_fseek(pb, pos, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1448 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1449 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1450 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1451 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1452
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1453 #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
1454
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1455 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
1456 AVPacket *pkt)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1457 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1458 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
1459 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
1460 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
1461 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
1462 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
1463
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1464 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
1465 return AVERROR(ENOMEM);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2761
diff changeset
1466 pkt->pos= url_ftell(s->pb);
5303
03d4d6534554 Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5271
diff changeset
1467 ret = read_packet(s, 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
1468 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
1469 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
1470 return ret;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1471 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1472 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
1473 /* 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
1474 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
1475 /* 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
1476 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
1477 for(i = 0; i < MAX_PACKET_READAHEAD; i++) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2761
diff changeset
1478 url_fseek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2761
diff changeset
1479 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
1480 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
1481 /* XXX: not precise enough */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1482 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
1483 (i + 1);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1484 break;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1485 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1486 }
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2761
diff changeset
1487 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
1488 /* 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
1489 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
1490 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1491 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
1492 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
1493 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
1494 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1495 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
1496 return 0;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1497 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1498
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1499 static int mpegts_read_packet(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1500 AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1501 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1502 MpegTSContext *ts = s->priv_data;
4963
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1503 int ret, i;
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1504
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1505 if (url_ftell(s->pb) != ts->last_pos) {
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1506 /* seek detected, flush pes buffer */
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1507 for (i = 0; i < NB_PID_MAX; i++) {
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1508 if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1509 PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1510 av_freep(&pes->buffer);
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1511 pes->data_index = 0;
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1512 pes->state = MPEGTS_SKIP; /* skip until pes header */
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1513 }
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1514 }
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1515 }
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1516
2108
31619b03d1ce split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents: 2101
diff changeset
1517 ts->pkt = pkt;
4963
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1518 ret = handle_packets(ts, 0);
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1519 if (ret < 0) {
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1520 /* flush pes data left */
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1521 for (i = 0; i < NB_PID_MAX; i++) {
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1522 if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1523 PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1524 if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1525 new_pes_packet(pes, pkt);
5174
664c0b8ae082 reset pes state to skip after flushing, avoid segv with dvgrab-2009.03.28_19-07-22.m2t
bcoudurier
parents: 5162
diff changeset
1526 pes->state = MPEGTS_SKIP;
4963
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1527 ret = 0;
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1528 break;
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1529 }
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1530 }
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1531 }
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1532 }
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1533
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1534 ts->last_pos = url_ftell(s->pb);
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1535
0c34f80265ac demux whole PES packets from TS
bcoudurier
parents: 4962
diff changeset
1536 return ret;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1537 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1538
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1539 static int mpegts_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1540 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1541 MpegTSContext *ts = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1542 int i;
3247
8876618cea62 Fixing memleaks.
michael
parents: 3240
diff changeset
1543
8876618cea62 Fixing memleaks.
michael
parents: 3240
diff changeset
1544 clear_programs(ts);
8876618cea62 Fixing memleaks.
michael
parents: 3240
diff changeset
1545
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1546 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
1547 if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]);
1046
92c01be95bbf fix memory leak on mpegts close
mru
parents: 996
diff changeset
1548
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1549 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1550 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1551
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1552 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
1553 int64_t *ppos, int64_t pos_limit)
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1554 {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1555 MpegTSContext *ts = s->priv_data;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1556 int64_t pos, timestamp;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1557 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
1558 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
1559 const int find_next= 1;
3240
78153a85dccc Ensure that the timestamp reading code used for seeking chooses a position
michael
parents: 3226
diff changeset
1560 pos = ((*ppos + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1561 if (find_next) {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1562 for(;;) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2761
diff changeset
1563 url_fseek(s->pb, pos, SEEK_SET);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2761
diff changeset
1564 if (get_buffer(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1565 return AV_NOPTS_VALUE;
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2159
diff changeset
1566 if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1567 parse_pcr(&timestamp, &pcr_l, buf) == 0) {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1568 break;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1569 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1570 pos += ts->raw_packet_size;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1571 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1572 } else {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1573 for(;;) {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1574 pos -= ts->raw_packet_size;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1575 if (pos < 0)
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1576 return AV_NOPTS_VALUE;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2761
diff changeset
1577 url_fseek(s->pb, pos, SEEK_SET);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2761
diff changeset
1578 if (get_buffer(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1579 return AV_NOPTS_VALUE;
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2159
diff changeset
1580 if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1581 parse_pcr(&timestamp, &pcr_l, buf) == 0) {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1582 break;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1583 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1584 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1585 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1586 *ppos = pos;
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
1587
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1588 return timestamp;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1589 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1590
5162
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1591 #ifdef USE_SYNCPOINT_SEARCH
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1592
5151
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1593 static int read_seek2(AVFormatContext *s,
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1594 int stream_index,
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1595 int64_t min_ts,
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1596 int64_t target_ts,
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1597 int64_t max_ts,
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1598 int flags)
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1599 {
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1600 int64_t pos;
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1601
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1602 int64_t ts_ret, ts_adj;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1603 int stream_index_gen_search;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1604 AVStream *st;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1605 AVParserState *backup;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1606
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1607 backup = ff_store_parser_state(s);
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1608
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1609 // detect direction of seeking for search purposes
5151
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1610 flags |= (target_ts - min_ts > (uint64_t)(max_ts - target_ts)) ?
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1611 AVSEEK_FLAG_BACKWARD : 0;
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1612
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1613 if (flags & AVSEEK_FLAG_BYTE) {
5151
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1614 // use position directly, we will search starting from it
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1615 pos = target_ts;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1616 } else {
5151
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1617 // search for some position with good timestamp match
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1618 if (stream_index < 0) {
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1619 stream_index_gen_search = av_find_default_stream_index(s);
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1620 if (stream_index_gen_search < 0) {
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1621 ff_restore_parser_state(s, backup);
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1622 return -1;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1623 }
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1624
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1625 st = s->streams[stream_index_gen_search];
5151
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1626 // timestamp for default must be expressed in AV_TIME_BASE units
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1627 ts_adj = av_rescale(target_ts,
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1628 st->time_base.den,
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1629 AV_TIME_BASE * (int64_t)st->time_base.num);
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1630 } else {
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1631 ts_adj = target_ts;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1632 stream_index_gen_search = stream_index;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1633 }
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1634 pos = av_gen_search(s, stream_index_gen_search, ts_adj,
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1635 0, INT64_MAX, -1,
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1636 AV_NOPTS_VALUE,
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1637 AV_NOPTS_VALUE,
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1638 flags, &ts_ret, mpegts_get_pcr);
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1639 if (pos < 0) {
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1640 ff_restore_parser_state(s, backup);
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1641 return -1;
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1642 }
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1643 }
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1644
5151
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1645 // search for actual matching keyframe/starting position for all streams
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1646 if (ff_gen_syncpoint_search(s, stream_index, pos,
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1647 min_ts, target_ts, max_ts,
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1648 flags) < 0) {
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1649 ff_restore_parser_state(s, backup);
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1650 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1651 }
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1652
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1653 ff_free_parser_state(s, backup);
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1654 return 0;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1655 }
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1656
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1657 static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1658 {
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1659 int ret;
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1660 if (flags & AVSEEK_FLAG_BACKWARD) {
5151
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1661 flags &= ~AVSEEK_FLAG_BACKWARD;
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1662 ret = read_seek2(s, stream_index, INT64_MIN, target_ts, target_ts, flags);
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1663 if (ret < 0)
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1664 // for compatibility reasons, seek to the best-fitting timestamp
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1665 ret = read_seek2(s, stream_index, INT64_MIN, target_ts, INT64_MAX, flags);
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1666 } else {
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1667 ret = read_seek2(s, stream_index, target_ts, target_ts, INT64_MAX, flags);
5151
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1668 if (ret < 0)
0e13b1b352ff Cosmetic changes in read_seek* routines.
schreter
parents: 5150
diff changeset
1669 // for compatibility reasons, seek to the best-fitting timestamp
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1670 ret = read_seek2(s, stream_index, INT64_MIN, target_ts, INT64_MAX, flags);
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1671 }
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1672 return ret;
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1673 }
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1674
5162
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1675 #else
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1676
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1677 static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1678 MpegTSContext *ts = s->priv_data;
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1679 uint8_t buf[TS_PACKET_SIZE];
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1680 int64_t pos;
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1681
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1682 if(av_seek_frame_binary(s, stream_index, target_ts, flags) < 0)
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1683 return -1;
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1684
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1685 pos= url_ftell(s->pb);
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1686
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1687 for(;;) {
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1688 url_fseek(s->pb, pos, SEEK_SET);
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1689 if (get_buffer(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1690 return -1;
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1691 // pid = AV_RB16(buf + 1) & 0x1fff;
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1692 if(buf[1] & 0x40) break;
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1693 pos += ts->raw_packet_size;
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1694 }
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1695 url_fseek(s->pb, pos, SEEK_SET);
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1696
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1697 return 0;
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1698 }
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1699
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1700 #endif
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1701
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1702 /**************************************************************/
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1703 /* 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
1704
5619
072cb3a1d4a7 Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents: 5542
diff changeset
1705 MpegTSContext *ff_mpegts_parse_open(AVFormatContext *s)
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1706 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1707 MpegTSContext *ts;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1708
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1709 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
1710 if (!ts)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1711 return NULL;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1712 /* 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
1713 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
1714 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
1715 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
1716 return ts;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1717 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1718
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1719 /* 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
1720 packet is output */
5619
072cb3a1d4a7 Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents: 5542
diff changeset
1721 int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt,
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1722 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
1723 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1724 int len1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1725
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1726 len1 = len;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1727 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
1728 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
1729 for(;;) {
2134
16cf48c9af53 dont rescan for information on each pid, but rather do it just once by
michael
parents: 2133
diff changeset
1730 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
1731 break;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1732 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
1733 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1734 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
1735 buf++;
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1736 len--;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1737 } else {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1738 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
1739 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
1740 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
1741 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1742 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1743 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
1744 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1745
5619
072cb3a1d4a7 Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents: 5542
diff changeset
1746 void ff_mpegts_parse_close(MpegTSContext *ts)
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1747 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1748 int i;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1749
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1750 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
1751 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
1752 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
1753 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1754
1167
d89d7ef290da give AVInput/OutputFormat structs consistent names
mru
parents: 1164
diff changeset
1755 AVInputFormat mpegts_demuxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1756 "mpegts",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3286
diff changeset
1757 NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1758 sizeof(MpegTSContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1759 mpegts_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1760 mpegts_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1761 mpegts_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1762 mpegts_read_close,
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1763 read_seek,
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
1764 mpegts_get_pcr,
3724
178cc6f9d5ec Add flag to mark demuxers that can output discontinuous timestamps.
michael
parents: 3716
diff changeset
1765 .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT,
5162
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1766 #ifdef USE_SYNCPOINT_SEARCH
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1767 .read_seek2 = read_seek2,
5162
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1768 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1769 };
2108
31619b03d1ce split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents: 2101
diff changeset
1770
31619b03d1ce split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents: 2101
diff changeset
1771 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
1772 "mpegtsraw",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3286
diff changeset
1773 NULL_IF_CONFIG_SMALL("MPEG-2 raw transport stream format"),
2108
31619b03d1ce split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents: 2101
diff changeset
1774 sizeof(MpegTSContext),
3226
dcde7da1d183 Using the same probe function in 2 formats is not a good idea.
michael
parents: 3059
diff changeset
1775 NULL,
2108
31619b03d1ce split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents: 2101
diff changeset
1776 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
1777 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
1778 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
1779 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
1780 mpegts_get_pcr,
3724
178cc6f9d5ec Add flag to mark demuxers that can output discontinuous timestamps.
michael
parents: 3716
diff changeset
1781 .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT,
5162
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1782 #ifdef USE_SYNCPOINT_SEARCH
5140
9c846d0a6803 Use generic multi-stream key frame finding routine to implement read_seek2 and map
schreter
parents: 5121
diff changeset
1783 .read_seek2 = read_seek2,
5162
68b98b497783 disable new seeking code in mpeg-ts per #ifdef (use old read_seek by default)
schreter
parents: 5151
diff changeset
1784 #endif
2108
31619b03d1ce split mpeg2ts_raw mode into its own demuxer using such a flag is an incredibly dirty hack
michael
parents: 2101
diff changeset
1785 };