annotate mpegts.c @ 1960:c0289552590f libavformat

Change the vhook code to send real timestamps to the filters instead of the current time of day, which is useless, and which the filters could just as easily query for themselves. patch by Bobby Bingham, uhmmmm gmail com
author diego
date Thu, 29 Mar 2007 05:24:35 +0000
parents 174083eafc6c
children a3e79d6e4e3c
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
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
3 * Copyright (c) 2002-2003 Fabrice Bellard.
0
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 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 #include "avformat.h"
996
2177aea28f4f generic crc calculation code
michael
parents: 896
diff changeset
22 #include "crc.h"
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
23 #include "mpegts.h"
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
24
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
25 //#define DEBUG_SI
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
26 //#define DEBUG_SEEK
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
28 /* 1.0 second at 24Mbit/s */
170
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
29 #define MAX_SCAN_PACKETS 32000
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
30
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
31 /* maximum size in which we look for synchronisation if
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
32 synchronisation is lost */
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
33 #define MAX_RESYNC_SIZE 4096
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
34
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
35 typedef struct PESContext PESContext;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
36
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
37 static PESContext* add_pes_stream(MpegTSContext *ts, int pid, int stream_type);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
38 static AVStream* new_pes_av_stream(PESContext *pes, uint32_t code);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
39
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
40 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
41 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
42 MPEGTS_SECTION,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
45 typedef void PESCallback(void *opaque, const uint8_t *buf, int len, 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
46
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
47 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
48 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
49 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
50 } MpegTSPESFilter;
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 void SectionCallback(void *opaque, const uint8_t *buf, 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
53
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
54 typedef void SetServiceCallback(void *opaque, int ret);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
56 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
57 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
58 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
59 uint8_t *section_buf;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
60 int check_crc:1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
61 int end_of_section_reached:1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
62 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
63 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
64 } MpegTSSectionFilter;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
65
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
66 typedef struct MpegTSFilter {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67 int pid;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 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
69 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
70 union {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
71 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
72 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
73 } u;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
74 } MpegTSFilter;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
75
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
76 typedef struct MpegTSService {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
77 int running:1;
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
78 int sid; /**< MPEG Program Number of stream */
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
79 char *provider_name; /**< DVB Network name, "" if not DVB stream */
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
80 char *name; /**< DVB Service name, "MPEG Program [sid]" if not DVB 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
81 } MpegTSService;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
83 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
84 /* 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
85 AVFormatContext *stream;
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
86 /** 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
87 int raw_packet_size;
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
88 /** 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
89 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
90 int set_service_ret;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
91
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
92 /** force raw MPEG2 transport stream output, if possible */
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
93 int mpeg2ts_raw;
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
94 /** 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
95 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
96
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
97 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
98 int pcr_incr; /**< used to estimate the exact PCR */
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
99 int pcr_pid; /**< used to estimate the exact PCR */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
100
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
101 /* data needed to handle file based ts */
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
102 /** stop parsing loop */
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
103 int stop_parse;
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
104 /** packet containing Audio/Video data */
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
105 AVPacket *pkt;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
106
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
107 /******************************************/
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
108 /* private mpegts data */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
109 /* scan context */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
110 MpegTSFilter *sdt_filter;
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
111 /** number of PMTs in the last PAT seen */
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 int nb_services;
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
113 /** list of PMTs in the last PAT seen */
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
114 MpegTSService **services;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
115
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
116 /* set service context (XXX: allocated it ?) */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
117 SetServiceCallback *set_service_cb;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
118 void *set_service_opaque;
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
119 /** filter for the PAT */
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 MpegTSFilter *pat_filter;
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
121 /** filter for the PMT for the MPEG program number specified by req_sid */
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 *pmt_filter;
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
123 /** MPEG program number of stream we want to decode */
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
124 int req_sid;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
125
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
126 /** 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
127 MpegTSFilter *pids[NB_PID_MAX];
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
128 };
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129
1726
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
130 /**
63bb140936c0 mpegts-documentation-only.patch -- adds documentation patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1724
diff changeset
131 * 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
132 * 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
133 */
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
134 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
135 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
136 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
137 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
138 int len;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
139
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
140 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
141 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
142 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
143 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
144 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
145 } else {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
146 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
147 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
148 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
149 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
150 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
151 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
152 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
153 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
154
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
155 /* 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
156 if (tss->section_h_size == -1 && tss->section_index >= 3) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
157 len = (((tss->section_buf[1] & 0xf) << 8) | tss->section_buf[2]) + 3;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
158 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
159 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
160 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
161 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
162
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
163 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
164 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
165 if (!tss->check_crc ||
996
2177aea28f4f generic crc calculation code
michael
parents: 896
diff changeset
166 av_crc(av_crc04C11DB7, -1, tss->section_buf, tss->section_h_size) == 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
167 tss->section_cb(tss->opaque, 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
168 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
169 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
170
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1047
diff changeset
171 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
172 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
173 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
174
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
175 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
176 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
177 MpegTSSectionFilter *sec;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
178
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
179 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
180 av_log(ts->stream, AV_LOG_DEBUG, "Filter: pid=0x%x\n", pid);
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
181 #endif
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
182 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
183 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
184 filter = av_mallocz(sizeof(MpegTSFilter));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
185 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
186 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
187 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
188 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
189 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
190 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
191 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
192 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
193 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
194 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
195 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
196 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
197 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
198 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
199 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
200 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
201 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
202
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1047
diff changeset
203 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
204 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
205 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
206 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
207 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
208 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
209
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
210 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
211 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
212 filter = av_mallocz(sizeof(MpegTSFilter));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
213 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
214 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
215 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
216 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
217 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
218 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
219 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
220 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
221 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
222 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
223 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
224
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1047
diff changeset
225 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
226 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
227 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
228
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
229 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
230 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
231 av_freep(&filter->u.section_filter.section_buf);
342
0c1b489c96bf memleak patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 329
diff changeset
232 else if (filter->type == MPEGTS_PES)
0c1b489c96bf memleak patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 329
diff changeset
233 av_freep(&filter->u.pes_filter.opaque);
0c1b489c96bf memleak patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 329
diff changeset
234
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
235 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
236 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
237 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
238
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
239 static int analyze(const uint8_t *buf, int size, int packet_size, int *index){
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
240 int stat[packet_size];
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
241 int i;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
242 int x=0;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
243 int best_score=0;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
244
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
245 memset(stat, 0, packet_size*sizeof(int));
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
246
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
247 for(x=i=0; i<size; i++){
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
248 if(buf[i] == 0x47){
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
249 stat[x]++;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
250 if(stat[x] > best_score){
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
251 best_score= stat[x];
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
252 if(index) *index= x;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
253 }
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
254 }
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
255
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
256 x++;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
257 if(x == packet_size) x= 0;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
258 }
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
259
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
260 return best_score;
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
261 }
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
262
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263 /* 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
264 static int get_packet_size(const uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 {
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
266 int score, fec_score, dvhs_score;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268 if (size < (TS_FEC_PACKET_SIZE * 5 + 1))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
269 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
270
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
271 score = analyze(buf, size, TS_PACKET_SIZE, NULL);
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
272 dvhs_score = analyze(buf, size, TS_DVHS_PACKET_SIZE, NULL);
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
273 fec_score= analyze(buf, size, TS_FEC_PACKET_SIZE, NULL);
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
274 // 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
275
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
276 if (score > fec_score && score > dvhs_score) return TS_PACKET_SIZE;
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
277 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
278 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
279 else return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
282 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
283 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
284 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
285 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
286 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
287 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
288 } SectionHeader;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
289
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
290 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
291 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
292 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
293 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
294
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
295 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
296 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
297 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
298 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
299 *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
300 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
301 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
302
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
303 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
304 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
305 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
306 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
307
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
308 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
309 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
310 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
311 c = (p[0] << 8) | 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
312 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
313 *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
314 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
315 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
316
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
317 /* 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
318 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
319 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
320 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
321 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
322 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
323
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
324 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
325 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
326 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
327 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
328 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
329 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
330 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
331 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
332 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
333 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
334 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
335 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
336 *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
337 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
338 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
339
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
340 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
341 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
342 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
343 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
344
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
345 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
346 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
347 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
348 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
349 *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
350 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
351 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
352 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
353 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
354 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
355 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
356 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
357 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
358 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
359 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
360 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
361 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
362 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
363 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
364 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
365 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
366 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
367 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
368
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
369 static MpegTSService *new_service(MpegTSContext *ts, int sid,
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
370 char *provider_name, char *name)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
371 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
372 MpegTSService *service;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
373
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
374 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
375 av_log(ts->stream, AV_LOG_DEBUG, "new_service: "
1724
940907f49a33 "converts printf's to avlog's" patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1481
diff changeset
376 "sid=0x%04x provider='%s' name='%s'\n",
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
377 sid, provider_name, name);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
378 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
379
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
380 service = av_mallocz(sizeof(MpegTSService));
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
381 if (!service)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
382 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
383 service->sid = sid;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
384 service->provider_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
385 service->name = name;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
386 dynarray_add(&ts->services, &ts->nb_services, service);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
387 return service;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
388 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
389
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
390 static void pmt_cb(void *opaque, const uint8_t *section, int section_len)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
391 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
392 MpegTSContext *ts = opaque;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
393 SectionHeader h1, *h = &h1;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
394 PESContext *pes;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
395 AVStream *st;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
396 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
397 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
398 int desc_list_len, desc_len, desc_tag;
851
62e66722e9bb Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 820
diff changeset
399 int comp_page = 0, anc_page = 0; /* initialize to kill warnings */
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
400 char language[4];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
401
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
402 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
403 av_log(ts->stream, AV_LOG_DEBUG, "PMT: len %i\n", section_len);
1908
174083eafc6c Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents: 1787
diff changeset
404 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
405 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
406 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
407 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
408 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
409 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
410 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
411 av_log(ts->stream, AV_LOG_DEBUG, "sid=0x%x sec_num=%d/%d\n",
1724
940907f49a33 "converts printf's to avlog's" patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1481
diff changeset
412 h->id, h->sec_num, h->last_sec_num);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
413 #endif
160
9bde37b1a5ce try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents: 152
diff changeset
414 if (h->tid != PMT_TID || (ts->req_sid >= 0 && h->id != ts->req_sid) )
152
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;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
416
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
417 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
418 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
419 return;
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
420 ts->pcr_pid = pcr_pid;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
421 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
422 av_log(ts->stream, AV_LOG_DEBUG, "pcr_pid=0x%x\n", pcr_pid);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
423 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
424 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
425 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
426 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
427 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
428 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
429 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
430 for(;;) {
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
431 language[0] = 0;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
432 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
433 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
434 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
435 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
436 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
437 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
438 break;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
439 desc_list_len = get16(&p, p_end) & 0xfff;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
440 if (desc_list_len < 0)
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
441 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
442 desc_list_end = p + desc_list_len;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
443 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
444 break;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
445 for(;;) {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
446 desc_tag = get8(&p, desc_list_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
447 if (desc_tag < 0)
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
448 break;
1164
55627fca95a1 Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents: 1124
diff changeset
449 if (stream_type == STREAM_TYPE_PRIVATE_DATA) {
55627fca95a1 Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents: 1124
diff changeset
450 if((desc_tag == 0x6A) || (desc_tag == 0x7A)) {
1047
76c75a88560d This patch simply adds demuxing support for AC-3 streams in DVB TS
mru
parents: 1046
diff changeset
451 /*assume DVB AC-3 Audio*/
76c75a88560d This patch simply adds demuxing support for AC-3 streams in DVB TS
mru
parents: 1046
diff changeset
452 stream_type = STREAM_TYPE_AUDIO_AC3;
1164
55627fca95a1 Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents: 1124
diff changeset
453 } else if(desc_tag == 0x7B) {
55627fca95a1 Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents: 1124
diff changeset
454 /* DVB DTS audio */
55627fca95a1 Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents: 1124
diff changeset
455 stream_type = STREAM_TYPE_AUDIO_DTS;
55627fca95a1 Etsi identifies DTS audio with stream_private+descriptor 0x7b (in the PMT).
mru
parents: 1124
diff changeset
456 }
1047
76c75a88560d This patch simply adds demuxing support for AC-3 streams in DVB TS
mru
parents: 1046
diff changeset
457 }
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
458 desc_len = get8(&p, desc_list_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
459 desc_end = p + desc_len;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
460 if (desc_end > desc_list_end)
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
461 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
462 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
463 av_log(ts->stream, AV_LOG_DEBUG, "tag: 0x%02x len=%d\n",
1724
940907f49a33 "converts printf's to avlog's" patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1481
diff changeset
464 desc_tag, desc_len);
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
465 #endif
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
466 switch(desc_tag) {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
467 case DVB_SUBT_DESCID:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
468 if (stream_type == STREAM_TYPE_PRIVATE_DATA)
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
469 stream_type = STREAM_TYPE_SUBTITLE_DVB;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
470
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
471 language[0] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
472 language[1] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
473 language[2] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
474 language[3] = 0;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
475 get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
476 comp_page = get16(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
477 anc_page = get16(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
478
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
479 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
480 case 0x0a: /* ISO 639 language descriptor */
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
481 language[0] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
482 language[1] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
483 language[2] = get8(&p, desc_end);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
484 language[3] = 0;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
485 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
486 default:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
487 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
488 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
489 p = desc_end;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
490 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
491 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
492
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
493 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
494 av_log(ts->stream, AV_LOG_DEBUG, "stream_type=%d pid=0x%x\n",
1724
940907f49a33 "converts printf's to avlog's" patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1481
diff changeset
495 stream_type, pid);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
496 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
497
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
498 /* now create ffmpeg stream */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
499 switch(stream_type) {
160
9bde37b1a5ce try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents: 152
diff changeset
500 case STREAM_TYPE_AUDIO_MPEG1:
9bde37b1a5ce try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents: 152
diff changeset
501 case STREAM_TYPE_AUDIO_MPEG2:
9bde37b1a5ce try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents: 152
diff changeset
502 case STREAM_TYPE_VIDEO_MPEG1:
9bde37b1a5ce try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents: 152
diff changeset
503 case STREAM_TYPE_VIDEO_MPEG2:
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 310
diff changeset
504 case STREAM_TYPE_VIDEO_MPEG4:
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 310
diff changeset
505 case STREAM_TYPE_VIDEO_H264:
1774
814fbf5732eb demux VC1 in mpegts
nicodvb
parents: 1748
diff changeset
506 case STREAM_TYPE_VIDEO_VC1:
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 310
diff changeset
507 case STREAM_TYPE_AUDIO_AAC:
165
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 160
diff changeset
508 case STREAM_TYPE_AUDIO_AC3:
496
112057e05179 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents: 474
diff changeset
509 case STREAM_TYPE_AUDIO_DTS:
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
510 case STREAM_TYPE_SUBTITLE_DVB:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
511 pes = add_pes_stream(ts, pid, stream_type);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
512 if (pes)
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
513 st = new_pes_av_stream(pes, 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
514 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
515 default:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
516 /* we ignore the other streams */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
517 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
518 }
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
519
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
520 if (st) {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
521 if (language[0] != 0) {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
522 st->language[0] = language[0];
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
523 st->language[1] = language[1];
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
524 st->language[2] = language[2];
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
525 st->language[3] = language[3];
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
526 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
527
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
528 if (stream_type == STREAM_TYPE_SUBTITLE_DVB) {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 819
diff changeset
529 st->codec->sub_id = (anc_page << 16) | comp_page;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
530 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
531 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
532 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
533 /* all parameters are there */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
534 ts->set_service_cb(ts->set_service_opaque, 0);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
535 mpegts_close_filter(ts, ts->pmt_filter);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
536 ts->pmt_filter = NULL;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
537 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
538
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
539 static void pat_cb(void *opaque, const uint8_t *section, int section_len)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
540 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
541 MpegTSContext *ts = opaque;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
542 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
543 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
544 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
545
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
546 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
547 av_log(ts->stream, AV_LOG_DEBUG, "PAT:\n");
1908
174083eafc6c Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents: 1787
diff changeset
548 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
549 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
550 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
551 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
552 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
553 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
554 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
555 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
556
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
557 for(;;) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
558 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
559 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
560 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
561 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
562 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
563 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
564 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
565 av_log(ts->stream, AV_LOG_DEBUG, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
566 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
567 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
568 /* 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
569 } else {
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
570 if (ts->req_sid == sid) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
571 ts->pmt_filter = mpegts_open_section_filter(ts, 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
572 pmt_cb, ts, 1);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
573 goto found;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
574 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
575 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
576 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
577 /* not found */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
578 ts->set_service_cb(ts->set_service_opaque, -1);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
579
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
580 found:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
581 mpegts_close_filter(ts, ts->pat_filter);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
582 ts->pat_filter = NULL;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
583 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
584
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
585 /* add all services found in the PAT */
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
586 static void pat_scan_cb(void *opaque, const uint8_t *section, int section_len)
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
587 {
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
588 MpegTSContext *ts = opaque;
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
589 SectionHeader h1, *h = &h1;
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
590 const uint8_t *p, *p_end;
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
591 int sid, pmt_pid;
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
592 char *provider_name, *name;
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
593 char buf[256];
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
594
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
595 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
596 av_log(ts->stream, AV_LOG_DEBUG, "PAT:\n");
1908
174083eafc6c Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents: 1787
diff changeset
597 av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len);
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
598 #endif
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
599 p_end = section + section_len - 4;
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
600 p = section;
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
601 if (parse_section_header(h, &p, p_end) < 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
602 return;
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
603 if (h->tid != PAT_TID)
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
604 return;
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
605
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
606 for(;;) {
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
607 sid = get16(&p, p_end);
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
608 if (sid < 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
609 break;
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
610 pmt_pid = get16(&p, p_end) & 0x1fff;
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
611 if (pmt_pid < 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
612 break;
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
613 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
614 av_log(ts->stream, AV_LOG_DEBUG, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
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
615 #endif
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
616 if (sid == 0x0000) {
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
617 /* NIT info */
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
618 } 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
619 /* add the service with a dummy name */
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
620 snprintf(buf, sizeof(buf), "Service %x\n", sid);
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
621 name = av_strdup(buf);
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
622 provider_name = av_strdup("");
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
623 if (name && provider_name) {
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
624 new_service(ts, sid, provider_name, name);
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
625 } 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
626 av_freep(&name);
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
627 av_freep(&provider_name);
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
628 }
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
629 }
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
630 }
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
631 ts->stop_parse = 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
632
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
633 /* remove filter */
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
634 mpegts_close_filter(ts, ts->pat_filter);
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
635 ts->pat_filter = NULL;
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
636 }
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
637
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1047
diff changeset
638 static void mpegts_set_service(MpegTSContext *ts, int sid,
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
639 SetServiceCallback *set_service_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
640 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
641 ts->set_service_cb = set_service_cb;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
642 ts->set_service_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
643 ts->req_sid = sid;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
644 ts->pat_filter = mpegts_open_section_filter(ts, PAT_PID,
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
645 pat_cb, ts, 1);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
646 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
647
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
648 static void sdt_cb(void *opaque, const uint8_t *section, int section_len)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
649 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
650 MpegTSContext *ts = opaque;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
651 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
652 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
653 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
654 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
655
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
656 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
657 av_log(ts->stream, AV_LOG_DEBUG, "SDT:\n");
1908
174083eafc6c Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents: 1787
diff changeset
658 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
659 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
660
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
661 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
662 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
663 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
664 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
665 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
666 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
667 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
668 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
669 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
670 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
671 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
672 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
673 for(;;) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
674 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
675 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
676 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
677 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
678 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
679 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
680 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
681 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
682 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
683 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
684 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
685 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
686 for(;;) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
687 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
688 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
689 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
690 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
691 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
692 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
693 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
694 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
695 av_log(ts->stream, AV_LOG_DEBUG, "tag: 0x%02x len=%d\n",
1724
940907f49a33 "converts printf's to avlog's" patch by Daniel Kristjansson / danielk mrl.nyu edu
michael
parents: 1481
diff changeset
696 desc_tag, desc_len);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
697 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
698 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
699 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
700 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
701 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
702 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
703 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
704 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
705 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
706 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
707 if (!name)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
708 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
709 new_service(ts, sid, provider_name, name);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
710 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
711 default:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
712 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
713 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
714 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
715 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
716 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
717 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
718 ts->stop_parse = 1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
719
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
720 /* remove filter */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
721 mpegts_close_filter(ts, ts->sdt_filter);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
722 ts->sdt_filter = NULL;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
723 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
724
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
725 /* scan services in a transport stream by looking at the SDT */
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1047
diff changeset
726 static void mpegts_scan_sdt(MpegTSContext *ts)
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
727 {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
728 ts->sdt_filter = mpegts_open_section_filter(ts, SDT_PID,
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
729 sdt_cb, ts, 1);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
730 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
731
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
732 /* scan services in a transport stream by looking at the PAT (better
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
733 than nothing !) */
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1047
diff changeset
734 static void mpegts_scan_pat(MpegTSContext *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
735 {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
736 ts->pat_filter = mpegts_open_section_filter(ts, PAT_PID,
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
737 pat_scan_cb, ts, 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
738 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
739
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
740 /* TS stream handling */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
741
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
742 enum MpegTSState {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
743 MPEGTS_HEADER = 0,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
744 MPEGTS_PESHEADER_FILL,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
745 MPEGTS_PAYLOAD,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
746 MPEGTS_SKIP,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
747 };
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
748
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
749 /* enough for PES header + length */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
750 #define PES_START_SIZE 9
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
751 #define MAX_PES_HEADER_SIZE (9 + 255)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
752
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
753 struct PESContext {
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
754 int pid;
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 310
diff changeset
755 int stream_type;
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
756 MpegTSContext *ts;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
757 AVFormatContext *stream;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
758 AVStream *st;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
759 enum MpegTSState state;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
760 /* used to get the format */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
761 int data_index;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
762 int total_size;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
763 int pes_header_size;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
764 int64_t pts, dts;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
765 uint8_t header[MAX_PES_HEADER_SIZE];
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
766 };
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
767
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
768 static int64_t get_pts(const uint8_t *p)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
769 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
770 int64_t pts;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
771 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
772
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
773 pts = (int64_t)((p[0] >> 1) & 0x07) << 30;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
774 val = (p[1] << 8) | 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
775 pts |= (int64_t)(val >> 1) << 15;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
776 val = (p[3] << 8) | p[4];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
777 pts |= (int64_t)(val >> 1);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
778 return pts;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
779 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
780
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
781 /* return non zero if a packet could be constructed */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
782 static void mpegts_push_data(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
783 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
784 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
785 PESContext *pes = opaque;
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
786 MpegTSContext *ts = pes->ts;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
787 const uint8_t *p;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
788 int len, code;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
789
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
790 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
791 pes->state = MPEGTS_HEADER;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
792 pes->data_index = 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
793 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
794 p = buf;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
795 while (buf_size > 0) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
796 switch(pes->state) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
797 case MPEGTS_HEADER:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
798 len = PES_START_SIZE - pes->data_index;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
799 if (len > buf_size)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
800 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
801 memcpy(pes->header + pes->data_index, p, len);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
802 pes->data_index += len;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
803 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
804 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
805 if (pes->data_index == PES_START_SIZE) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
806 /* we got all the PES or section header. We can now
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
807 decide */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
808 #if 0
1908
174083eafc6c Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents: 1787
diff changeset
809 av_hex_dump_log(pes->stream, AV_LOG_DEBUG, pes->header, pes->data_index);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
810 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
811 if (pes->header[0] == 0x00 && pes->header[1] == 0x00 &&
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
812 pes->header[2] == 0x01) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
813 /* it must be an mpeg2 PES stream */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
814 code = pes->header[3] | 0x100;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
815 if (!((code >= 0x1c0 && code <= 0x1df) ||
165
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 160
diff changeset
816 (code >= 0x1e0 && code <= 0x1ef) ||
1774
814fbf5732eb demux VC1 in mpegts
nicodvb
parents: 1748
diff changeset
817 (code == 0x1bd) || (code == 0x1fd)))
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
818 goto skip;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
819 if (!pes->st) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
820 /* allocate stream */
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
821 new_pes_av_stream(pes, code);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
822 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
823 pes->state = MPEGTS_PESHEADER_FILL;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
824 pes->total_size = (pes->header[4] << 8) | pes->header[5];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
825 /* NOTE: a zero total size means the PES size is
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
826 unbounded */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
827 if (pes->total_size)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
828 pes->total_size += 6;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
829 pes->pes_header_size = pes->header[8] + 9;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
830 } else {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
831 /* otherwise, it should be a table */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
832 /* skip packet */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
833 skip:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
834 pes->state = MPEGTS_SKIP;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
835 continue;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
836 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
837 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
838 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
839 /**********************************************/
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
840 /* PES packing parsing */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
841 case MPEGTS_PESHEADER_FILL:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
842 len = pes->pes_header_size - pes->data_index;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
843 if (len > buf_size)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
844 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
845 memcpy(pes->header + pes->data_index, p, len);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
846 pes->data_index += len;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
847 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
848 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
849 if (pes->data_index == pes->pes_header_size) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
850 const uint8_t *r;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
851 unsigned int flags;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
852
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
853 flags = pes->header[7];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
854 r = pes->header + 9;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
855 pes->pts = AV_NOPTS_VALUE;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
856 pes->dts = AV_NOPTS_VALUE;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
857 if ((flags & 0xc0) == 0x80) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
858 pes->pts = get_pts(r);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
859 r += 5;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
860 } else if ((flags & 0xc0) == 0xc0) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
861 pes->pts = get_pts(r);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
862 r += 5;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
863 pes->dts = get_pts(r);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
864 r += 5;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
865 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
866 /* we got the full header. We parse it and get the payload */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
867 pes->state = MPEGTS_PAYLOAD;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
868 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
869 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
870 case MPEGTS_PAYLOAD:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
871 if (pes->total_size) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
872 len = pes->total_size - pes->data_index;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
873 if (len > buf_size)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
874 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
875 } else {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
876 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
877 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
878 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
879 AVPacket *pkt = ts->pkt;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
880 if (pes->st && av_new_packet(pkt, len) == 0) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
881 memcpy(pkt->data, p, len);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
882 pkt->stream_index = pes->st->index;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
883 pkt->pts = pes->pts;
367
3fca8e9142a4 avsync patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents: 342
diff changeset
884 pkt->dts = pes->dts;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
885 /* reset pts values */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
886 pes->pts = AV_NOPTS_VALUE;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
887 pes->dts = AV_NOPTS_VALUE;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
888 ts->stop_parse = 1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
889 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
890 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
891 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
892 buf_size = 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
893 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
894 case MPEGTS_SKIP:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
895 buf_size = 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
896 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
897 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
898 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
899 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
900
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
901 static AVStream* new_pes_av_stream(PESContext *pes, uint32_t code)
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
902 {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
903 AVStream *st;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
904 int codec_type, codec_id;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
905
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
906 switch(pes->stream_type){
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
907 case STREAM_TYPE_AUDIO_MPEG1:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
908 case STREAM_TYPE_AUDIO_MPEG2:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
909 codec_type = CODEC_TYPE_AUDIO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
910 codec_id = CODEC_ID_MP3;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
911 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
912 case STREAM_TYPE_VIDEO_MPEG1:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
913 case STREAM_TYPE_VIDEO_MPEG2:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
914 codec_type = CODEC_TYPE_VIDEO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
915 codec_id = CODEC_ID_MPEG2VIDEO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
916 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
917 case STREAM_TYPE_VIDEO_MPEG4:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
918 codec_type = CODEC_TYPE_VIDEO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
919 codec_id = CODEC_ID_MPEG4;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
920 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
921 case STREAM_TYPE_VIDEO_H264:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
922 codec_type = CODEC_TYPE_VIDEO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
923 codec_id = CODEC_ID_H264;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
924 break;
1774
814fbf5732eb demux VC1 in mpegts
nicodvb
parents: 1748
diff changeset
925 case STREAM_TYPE_VIDEO_VC1:
814fbf5732eb demux VC1 in mpegts
nicodvb
parents: 1748
diff changeset
926 codec_type = CODEC_TYPE_VIDEO;
814fbf5732eb demux VC1 in mpegts
nicodvb
parents: 1748
diff changeset
927 codec_id = CODEC_ID_VC1;
814fbf5732eb demux VC1 in mpegts
nicodvb
parents: 1748
diff changeset
928 break;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
929 case STREAM_TYPE_AUDIO_AAC:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
930 codec_type = CODEC_TYPE_AUDIO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
931 codec_id = CODEC_ID_AAC;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
932 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
933 case STREAM_TYPE_AUDIO_AC3:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
934 codec_type = CODEC_TYPE_AUDIO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
935 codec_id = CODEC_ID_AC3;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
936 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
937 case STREAM_TYPE_AUDIO_DTS:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
938 codec_type = CODEC_TYPE_AUDIO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
939 codec_id = CODEC_ID_DTS;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
940 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
941 case STREAM_TYPE_SUBTITLE_DVB:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
942 codec_type = CODEC_TYPE_SUBTITLE;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
943 codec_id = CODEC_ID_DVB_SUBTITLE;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
944 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
945 default:
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
946 if (code >= 0x1c0 && code <= 0x1df) {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
947 codec_type = CODEC_TYPE_AUDIO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
948 codec_id = CODEC_ID_MP2;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
949 } else if (code == 0x1bd) {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
950 codec_type = CODEC_TYPE_AUDIO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
951 codec_id = CODEC_ID_AC3;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
952 } else {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
953 codec_type = CODEC_TYPE_VIDEO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
954 codec_id = CODEC_ID_MPEG1VIDEO;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
955 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
956 break;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
957 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
958 st = av_new_stream(pes->stream, pes->pid);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
959 if (st) {
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
960 av_set_pts_info(st, 33, 1, 90000);
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
961 st->priv_data = pes;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 819
diff changeset
962 st->codec->codec_type = codec_type;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 819
diff changeset
963 st->codec->codec_id = codec_id;
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
964 st->need_parsing = 1;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
965 pes->st = st;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
966 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
967 return st;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
968 }
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
969
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
970
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
971 static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int stream_type)
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
972 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
973 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
974 PESContext *pes;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
975
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
976 /* if no pid found, then add a pid context */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
977 pes = av_mallocz(sizeof(PESContext));
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
978 if (!pes)
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
979 return 0;
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
980 pes->ts = ts;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
981 pes->stream = ts->stream;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
982 pes->pid = pid;
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 310
diff changeset
983 pes->stream_type = stream_type;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
984 tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
985 if (!tss) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
986 av_free(pes);
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
987 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
988 }
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
989 return pes;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
990 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
991
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
992 /* handle one TS packet */
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
993 static void handle_packet(MpegTSContext *ts, const uint8_t *packet)
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
994 {
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
995 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
996 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
997 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
998 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
999
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1000 pid = ((packet[1] & 0x1f) << 8) | packet[2];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1001 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
1002 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
1003 if (ts->auto_guess && tss == NULL && is_start) {
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 310
diff changeset
1004 add_pes_stream(ts, pid, 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
1005 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
1006 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1007 if (!tss)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1008 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1009
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1010 /* 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
1011 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
1012 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
1013 tss->last_cc = cc;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1014
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1015 /* 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
1016 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
1017 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
1018 if (afc == 0) /* reserved value */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1019 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1020 if (afc == 2) /* adaptation field only */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1021 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1022 if (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
1023 /* 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
1024 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
1025 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1026 /* 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
1027 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
1028 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
1029 return;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1030
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1031 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
1032 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
1033 /* 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
1034 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
1035 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
1036 return;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1037 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
1038 /* write remaining section bytes */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1039 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
1040 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
1041 /* 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
1042 if (!ts->pids[pid])
29a19aec26b2 Writing to freed memory in write_section_data() patch by (Wolfram Gloger <wmglo dent dot med dot uni-muenchen de>)
michael
parents: 555
diff changeset
1043 return;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1044 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1045 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
1046 if (p < p_end) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1047 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
1048 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
1049 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1050 } else {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1051 if (cc_ok) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1052 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
1053 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
1054 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1055 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1056 } else {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1057 tss->u.pes_filter.pes_cb(tss->u.pes_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
1058 p, p_end - p, is_start);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1059 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1060 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1061
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
1062 /* 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
1063 get_packet_size() ?) */
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1064 static int mpegts_resync(ByteIOContext *pb)
170
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
1065 {
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
1066 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
1067
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
1068 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
1069 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
1070 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
1071 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
1072 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
1073 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
1074 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
1075 }
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
1076 }
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
1077 /* 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
1078 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
1079 }
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
1080
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1081 /* return -1 if error or EOF. Return 0 if OK. */
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1082 static int read_packet(ByteIOContext *pb, uint8_t *buf, int raw_packet_size)
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1083 {
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1084 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
1085
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1086 for(;;) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1087 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
1088 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
1089 return AVERROR_IO;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1090 /* 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
1091 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
1092 /* 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
1093 url_fseek(pb, -TS_PACKET_SIZE, SEEK_CUR);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1094 if (mpegts_resync(pb) < 0)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1095 return AVERROR_INVALIDDATA;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1096 else
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1097 continue;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1098 } else {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1099 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
1100 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
1101 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
1102 break;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1103 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1104 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1105 return 0;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1106 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1107
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1108 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
1109 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1110 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
1111 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
1112 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
1113 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
1114
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1115 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
1116 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
1117 for(;;) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1118 if (ts->stop_parse)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1119 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1120 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
1121 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
1122 break;
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1123 ret = read_packet(pb, packet, ts->raw_packet_size);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1124 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
1125 return ret;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1126 handle_packet(ts, packet);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1127 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1128 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
1129 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1130
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1131 static int mpegts_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1132 {
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
1133 #if 1
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1134 const int size= p->buf_size;
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
1135 int score, fec_score, dvhs_score;
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1136 #define CHECK_COUNT 10
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1137
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1138 if (size < (TS_FEC_PACKET_SIZE * CHECK_COUNT))
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1139 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1140
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1141 score = analyze(p->buf, TS_PACKET_SIZE *CHECK_COUNT, TS_PACKET_SIZE, NULL);
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
1142 dvhs_score = analyze(p->buf, TS_DVHS_PACKET_SIZE *CHECK_COUNT, TS_DVHS_PACKET_SIZE, NULL);
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1143 fec_score= analyze(p->buf, TS_FEC_PACKET_SIZE*CHECK_COUNT, TS_FEC_PACKET_SIZE, NULL);
891
6e45fbd73a52 added support for DVHS (192) packet size
nicodvb
parents: 885
diff changeset
1144 // 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
1145
329
d20a3caaef29 better get_packet_size and probe
michael
parents: 313
diff changeset
1146 // 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
1147 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
1148 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
1149 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
1150 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
1151 #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
1152 /* only use the extension for safer guess */
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
1153 if (match_ext(p->filename, "ts"))
0543d27721c1 cosmetic change in resync code - added PAT scanning code if no SDT is found (in the futur it would be interesting to give an API to change channel - also useful for DV input number or TV grab tunning
bellard
parents: 165
diff changeset
1154 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
1155 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
1156 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
1157 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1158 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1159
1481
08322a7e3804 make some symbols static
mru
parents: 1415
diff changeset
1160 static void set_service_cb(void *opaque, int 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
1161 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1162 MpegTSContext *ts = opaque;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1163 ts->set_service_ret = ret;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1164 ts->stop_parse = 1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1165 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1166
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1167 /* return the 90 kHz PCR and the extension for the 27 MHz PCR. return
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1168 (-1) if not available */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1169 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
1170 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
1171 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1172 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
1173 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
1174 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
1175
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1176 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
1177 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
1178 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1179 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
1180 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
1181 p++;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1182 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
1183 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1184 flags = *p++;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1185 len--;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1186 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
1187 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1188 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
1189 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1190 v = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1191 *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
1192 *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
1193 return 0;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1194 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1195
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1196 static int mpegts_read_header(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1197 AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1198 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1199 MpegTSContext *ts = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1200 ByteIOContext *pb = &s->pb;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1201 uint8_t buf[1024];
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1202 int len, sid, i;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 0
diff changeset
1203 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
1204 MpegTSService *service;
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1205
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1206 if (ap) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1207 ts->mpeg2ts_raw = ap->mpeg2ts_raw;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1208 ts->mpeg2ts_compute_pcr = ap->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
1209 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1210
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1211 /* read the first 1024 bytes to get packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1212 pos = url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1213 len = get_buffer(pb, buf, sizeof(buf));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1214 if (len != sizeof(buf))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1215 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1216 ts->raw_packet_size = get_packet_size(buf, sizeof(buf));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1217 if (ts->raw_packet_size <= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1218 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
1219 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
1220 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
1221
892
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1222 goto_auto_guess:
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1223 if (!ts->mpeg2ts_raw) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1224 /* 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
1225
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1226 if (!ts->auto_guess) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1227 ts->set_service_ret = -1;
160
9bde37b1a5ce try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents: 152
diff changeset
1228
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1229 /* first do a scaning to get all the services */
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
1230 url_fseek(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
1231 mpegts_scan_sdt(ts);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1232
1280
8505bbb024c5 scan s->probesize packets instead of MAX_SCAN_PACKETS (that is still the default value)
nicodvb
parents: 1169
diff changeset
1233 handle_packets(ts, s->probesize);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1234
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1235 if (ts->nb_services <= 0) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1236 /* no SDT found, we try to look at the PAT */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1237
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1238 /* First remove the SDT filters from each PID */
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1239 int i;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1240 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
1241 if (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
1242 mpegts_close_filter(ts, 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
1243 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1244 url_fseek(pb, pos, SEEK_SET);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1245 mpegts_scan_pat(ts);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1246
1280
8505bbb024c5 scan s->probesize packets instead of MAX_SCAN_PACKETS (that is still the default value)
nicodvb
parents: 1169
diff changeset
1247 handle_packets(ts, s->probesize);
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1248 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1249
398
0d92246d3644 Support raw mpegts streams from dvr patch by (wmglo at dent dot med dot uni-muenchen dot de)
michael
parents: 367
diff changeset
1250 if (ts->nb_services <= 0) {
819
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1251 /* raw transport stream */
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1252 ts->auto_guess = 1;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1253 s->ctx_flags |= AVFMTCTX_NOHEADER;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1254 goto do_pcr;
a6c035e7f429 DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 775
diff changeset
1255 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1256
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1257 /* tune to first service found */
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1258 for(i=0; i<ts->nb_services && ts->set_service_ret; i++){
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1259 service = ts->services[i];
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1260 sid = service->sid;
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1261 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
1262 av_log(ts->stream, AV_LOG_DEBUG, "tuning to '%s'\n", service->name);
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1263 #endif
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1264
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1265 /* now find the info for the first service if we found any,
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1266 otherwise try to filter all PATs */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1267
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1268 url_fseek(pb, pos, SEEK_SET);
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1269 mpegts_set_service(ts, sid, set_service_cb, ts);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1270
1280
8505bbb024c5 scan s->probesize packets instead of MAX_SCAN_PACKETS (that is still the default value)
nicodvb
parents: 1169
diff changeset
1271 handle_packets(ts, s->probesize);
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1272 }
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1273 /* if could not find service, exit */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1274
892
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1275 if (ts->set_service_ret != 0) {
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1276 if(ts->auto_guess)
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1277 return -1;
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1278 else {
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1279 //let's retry with auto_guess set
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1280 ts->auto_guess = 1;
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1281 goto goto_auto_guess;
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1282 }
1917a1f7d223 try with auto_guess if first detection fails
nicodvb
parents: 891
diff changeset
1283 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1284
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1285 #ifdef DEBUG_SI
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
1286 av_log(ts->stream, AV_LOG_DEBUG, "tuning done\n");
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1287 #endif
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
1288 }
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1289 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
1290 } else {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1291 AVStream *st;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1292 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
1293 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
1294 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
1295 uint8_t packet[TS_PACKET_SIZE];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1296
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1297 /* only read packets */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1298
398
0d92246d3644 Support raw mpegts streams from dvr patch by (wmglo at dent dot med dot uni-muenchen dot de)
michael
parents: 367
diff changeset
1299 do_pcr:
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1300 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
1301 if (!st)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1302 goto fail;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 444
diff changeset
1303 av_set_pts_info(st, 60, 1, 27000000);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 819
diff changeset
1304 st->codec->codec_type = CODEC_TYPE_DATA;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 819
diff changeset
1305 st->codec->codec_id = CODEC_ID_MPEG2TS;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1306
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1307 /* 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
1308 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
1309 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
1310 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
1311 for(;;) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1312 ret = read_packet(&s->pb, packet, ts->raw_packet_size);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1313 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
1314 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1315 pid = ((packet[1] & 0x1f) << 8) | packet[2];
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1316 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
1317 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
1318 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
1319 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
1320 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
1321 nb_pcrs++;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1322 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
1323 break;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1324 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1325 nb_packets++;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1326 }
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1327 ts->pcr_pid = pcr_pid;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1328
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1329 /* 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
1330 /* 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
1331 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
1332 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
1333 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
1334 st->codec->bit_rate = s->bit_rate;
743
af4e24d6310c switch to native time bases
michael
parents: 675
diff changeset
1335 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
1336 #if 0
1748
181594c4f729 Add some context to av_log calls.
diego
parents: 1726
diff changeset
1337 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
1338 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
1339 #endif
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1340 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents: 107
diff changeset
1341
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1342 url_fseek(pb, pos, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1343 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1344 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1345 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1346 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1347
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1348 #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
1349
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1350 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
1351 AVPacket *pkt)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1352 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1353 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
1354 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
1355 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
1356 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
1357 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
1358
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1359 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
1360 return AVERROR(ENOMEM);
775
c5077fdab490 AVPacket.pos
michael
parents: 746
diff changeset
1361 pkt->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
1362 ret = read_packet(&s->pb, pkt->data, ts->raw_packet_size);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1363 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
1364 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
1365 return ret;
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 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
1368 /* 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
1369 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
1370 /* we read the next PCR (XXX: optimize it by using a bigger buffer */
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1371 pos = url_ftell(&s->pb);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1372 for(i = 0; i < MAX_PACKET_READAHEAD; i++) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1373 url_fseek(&s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1374 get_buffer(&s->pb, 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
1375 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
1376 /* XXX: not precise enough */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1377 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
1378 (i + 1);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1379 break;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1380 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1381 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1382 url_fseek(&s->pb, pos, SEEK_SET);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1383 /* 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
1384 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
1385 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1386 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
1387 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
1388 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
1389 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1390 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
1391 return 0;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1392 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1393
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1394 static int mpegts_read_packet(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1395 AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1396 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1397 MpegTSContext *ts = s->priv_data;
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1398
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1399 if (!ts->mpeg2ts_raw) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1400 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
1401 return handle_packets(ts, 0);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1402 } else {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1403 return mpegts_raw_read_packet(s, pkt);
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1404 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1405 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1406
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1407 static int mpegts_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1408 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1409 MpegTSContext *ts = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1410 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1411 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
1412 if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]);
1046
92c01be95bbf fix memory leak on mpegts close
mru
parents: 996
diff changeset
1413
92c01be95bbf fix memory leak on mpegts close
mru
parents: 996
diff changeset
1414 for(i = 0; i < ts->nb_services; i++){
92c01be95bbf fix memory leak on mpegts close
mru
parents: 996
diff changeset
1415 av_free(ts->services[i]->provider_name);
92c01be95bbf fix memory leak on mpegts close
mru
parents: 996
diff changeset
1416 av_free(ts->services[i]->name);
92c01be95bbf fix memory leak on mpegts close
mru
parents: 996
diff changeset
1417 av_free(ts->services[i]);
92c01be95bbf fix memory leak on mpegts close
mru
parents: 996
diff changeset
1418 }
92c01be95bbf fix memory leak on mpegts close
mru
parents: 996
diff changeset
1419 av_freep(&ts->services);
92c01be95bbf fix memory leak on mpegts close
mru
parents: 996
diff changeset
1420
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1421 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1422 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1423
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1424 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
1425 int64_t *ppos, int64_t pos_limit)
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1426 {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1427 MpegTSContext *ts = s->priv_data;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1428 int64_t pos, timestamp;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1429 uint8_t buf[TS_PACKET_SIZE];
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1430 int pcr_l, pid;
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
1431 const int find_next= 1;
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
1432 pos = ((*ppos + ts->raw_packet_size - 1) / ts->raw_packet_size) * ts->raw_packet_size;
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1433 if (find_next) {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1434 for(;;) {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1435 url_fseek(&s->pb, pos, SEEK_SET);
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1436 if (get_buffer(&s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1437 return AV_NOPTS_VALUE;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1438 pid = ((buf[1] & 0x1f) << 8) | buf[2];
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1439 if (pid == ts->pcr_pid &&
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1440 parse_pcr(&timestamp, &pcr_l, buf) == 0) {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1441 break;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1442 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1443 pos += ts->raw_packet_size;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1444 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1445 } else {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1446 for(;;) {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1447 pos -= ts->raw_packet_size;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1448 if (pos < 0)
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1449 return AV_NOPTS_VALUE;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1450 url_fseek(&s->pb, pos, SEEK_SET);
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1451 if (get_buffer(&s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1452 return AV_NOPTS_VALUE;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1453 pid = ((buf[1] & 0x1f) << 8) | buf[2];
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1454 if (pid == ts->pcr_pid &&
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1455 parse_pcr(&timestamp, &pcr_l, buf) == 0) {
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1456 break;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1457 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1458 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1459 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1460 *ppos = pos;
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
1461
310
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1462 return timestamp;
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1463 }
944c8edaf609 seek support
bellard
parents: 292
diff changeset
1464
555
0a997108f384 use native timebase for seeking
michael
parents: 496
diff changeset
1465 static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1466 MpegTSContext *ts = s->priv_data;
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1467 uint8_t buf[TS_PACKET_SIZE];
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1468 int64_t pos;
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1469
555
0a997108f384 use native timebase for seeking
michael
parents: 496
diff changeset
1470 if(av_seek_frame_binary(s, stream_index, target_ts, flags) < 0)
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1471 return -1;
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1472
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1473 pos= url_ftell(&s->pb);
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1475 for(;;) {
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1476 url_fseek(&s->pb, pos, SEEK_SET);
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1477 if (get_buffer(&s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1478 return -1;
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1479 // pid = ((buf[1] & 0x1f) << 8) | buf[2];
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1480 if(buf[1] & 0x40) break;
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1481 pos += ts->raw_packet_size;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1482 }
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1483 url_fseek(&s->pb, pos, SEEK_SET);
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1484
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1485 return 0;
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1486 }
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1487
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1488 /**************************************************************/
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1489 /* 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
1490
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1491 MpegTSContext *mpegts_parse_open(AVFormatContext *s)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1492 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1493 MpegTSContext *ts;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1494
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1495 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
1496 if (!ts)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1497 return NULL;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1498 /* 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
1499 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
1500 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
1501 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
1502 return ts;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1503 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1504
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1505 /* 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
1506 packet is output */
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1507 int mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt,
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1508 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
1509 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1510 int len1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1511
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1512 len1 = len;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1513 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
1514 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
1515 for(;;) {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1516 if (ts->stop_parse)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1517 break;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1518 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
1519 return -1;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1520 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
1521 buf++;
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1522 len--;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1523 } else {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1524 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
1525 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
1526 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
1527 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1528 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1529 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
1530 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1531
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1532 void mpegts_parse_close(MpegTSContext *ts)
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1533 {
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1534 int i;
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1535
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1536 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
1537 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
1538 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
1539 }
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1540
1167
d89d7ef290da give AVInput/OutputFormat structs consistent names
mru
parents: 1164
diff changeset
1541 AVInputFormat mpegts_demuxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1542 "mpegts",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1543 "MPEG2 transport stream format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1544 sizeof(MpegTSContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1545 mpegts_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1546 mpegts_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1547 mpegts_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1548 mpegts_read_close,
474
2846bb67dd8f fix playback of http://www.zonque.org/test-long.ps
michael
parents: 463
diff changeset
1549 read_seek,
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
1550 mpegts_get_pcr,
292
155ce13f1033 mpeg TS demux API (called from RTP layer) - raw mpeg TS reader (uses fake codec MPEG2TS)
bellard
parents: 283
diff changeset
1551 .flags = AVFMT_SHOW_IDS,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1552 };