annotate libmpdemux/demux_ts.c @ 37058:a6b7e61e4af1

Disable system DPI scaling on Windows. We scale the video just fine (or rather, better) ourselves. The GUI might be in trouble here though, since it does not want its video to be scaled by the OS but it also isn't DPI aware either...
author reimar
date Sat, 19 Apr 2014 08:30:17 +0000
parents 92dd1764392a
children a0a13230b8d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1 /*
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
2 * Demultiplexer for MPEG2 Transport Streams.
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
3 *
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
4 * Written by Nico <nsabbi@libero.it>
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
5 * Kind feedback is appreciated; 'sucks' and alike is not.
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
6 * Originally based on demux_pva.c written by Matteo Giani and FFmpeg (libavformat) sources
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
7 *
29237
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
8 * This file is part of MPlayer.
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
9 *
29237
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
10 * MPlayer is free software; you can redistribute it and/or modify
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
11 * it under the terms of the GNU General Public License as published by
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
12 * the Free Software Foundation; either version 2 of the License, or
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
13 * (at your option) any later version.
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
14 *
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
15 * MPlayer is distributed in the hope that it will be useful,
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29237
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
18 * GNU General Public License for more details.
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
19 *
29237
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
20 * You should have received a copy of the GNU General Public License along
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
21 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
c4dc4cf9347b Replace informal GPL license header by standard GPL header.
diego
parents: 28770
diff changeset
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
23 */
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
24
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
25 #include <stdio.h>
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
26 #include <stdlib.h>
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
27 #include <string.h>
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
28
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
29 #include "config.h"
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
30 #include "mp_msg.h"
32060
c3b7fc7eb796 Move audio_lang / dvdsub_lang extern variable declarations to mpcommon.h.
diego
parents: 31850
diff changeset
31 #include "mpcommon.h"
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
32 #include "help_mp.h"
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
33
32345
e9556f0abee8 Replace forward declarations of skip_audio_frame() by proper #include.
diego
parents: 32115
diff changeset
34 #include "libmpcodecs/dec_audio.h"
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 22352
diff changeset
35 #include "stream/stream.h"
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
36 #include "demuxer.h"
11412
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 11190
diff changeset
37 #include "parse_es.h"
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
38 #include "stheader.h"
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
39 #include "ms_hdr.h"
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
40 #include "mpeg_hdr.h"
30576
24a5dc9d1466 Add separate header for mp_a52_framesize(); avoids forward declarations.
diego
parents: 30387
diff changeset
41 #include "demux_ts.h"
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
42
13994
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
43 #define TS_PH_PACKET_SIZE 192
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
44 #define TS_FEC_PACKET_SIZE 204
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
45 #define TS_PACKET_SIZE 188
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
46 #define NB_PID_MAX 8192
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
47
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
48 #define MAX_HEADER_SIZE 6 /* enough for PES header + length */
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
49 #define MAX_CHECK_SIZE 65535
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
50 #define NUM_CONSECUTIVE_TS_PACKETS 32
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
51 #define NUM_CONSECUTIVE_AUDIO_PACKETS 348
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
52 #define MAX_A52_FRAME_SIZE 3840
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
53
18475
23fedcdd08a0 where necesary, replaced all realloc() with realloc_struct() to prevent int oveflows
nicodvb
parents: 18474
diff changeset
54 #ifndef SIZE_MAX
23fedcdd08a0 where necesary, replaced all realloc() with realloc_struct() to prevent int oveflows
nicodvb
parents: 18474
diff changeset
55 #define SIZE_MAX ((size_t)-1)
23fedcdd08a0 where necesary, replaced all realloc() with realloc_struct() to prevent int oveflows
nicodvb
parents: 18474
diff changeset
56 #endif
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
57
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
58 #define TYPE_AUDIO 1
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
59 #define TYPE_VIDEO 2
32359
3f8dcfb95845 Fix switching audio track with the native MPEG-TS demuxer after an
cehoyos
parents: 32345
diff changeset
60 #define TYPE_SUB 3
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
61
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
62 int ts_prog;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
63 int ts_keep_broken=0;
23509
53d57a0ebe13 init ts_probe to 0 and probe up to TS_MAX_PROBE_SIZE if the parameter
nicodvb
parents: 23507
diff changeset
64 off_t ts_probe = 0;
28210
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
65 int audio_substream_id = -1;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
66
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
67 typedef enum
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
68 {
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
69 UNKNOWN = -1,
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
70 VIDEO_MPEG1 = 0x10000001,
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
71 VIDEO_MPEG2 = 0x10000002,
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
72 VIDEO_MPEG4 = 0x10000004,
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 13994
diff changeset
73 VIDEO_H264 = 0x10000005,
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
74 VIDEO_AVC = mmioFOURCC('a', 'v', 'c', '1'),
31261
cd1dd08a0afc Add partial support for dirac to TS demuxer.
reimar
parents: 31225
diff changeset
75 VIDEO_DIRAC = mmioFOURCC('d', 'r', 'a', 'c'),
36379
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
76 VIDEO_HEVC = mmioFOURCC('H', 'E', 'V', 'C'),
22162
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
77 VIDEO_VC1 = mmioFOURCC('W', 'V', 'C', '1'),
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
78 AUDIO_MP2 = 0x50,
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
79 AUDIO_A52 = 0x2000,
18565
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
80 AUDIO_DTS = 0x2001,
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
81 AUDIO_LPCM_BE = 0x10001,
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
82 AUDIO_AAC = mmioFOURCC('M', 'P', '4', 'A'),
31455
1a6d1a20ac79 Place AUDIO_AAC_LATM definition next to AUDIO_AAC.
reimar
parents: 31454
diff changeset
83 AUDIO_AAC_LATM = mmioFOURCC('M', 'P', '4', 'L'),
29415
ed4191b00420 handle TrueHD streams (they are carried in 0xFD PES streams in substream 0x72)
nicodvb
parents: 29339
diff changeset
84 AUDIO_TRUEHD = mmioFOURCC('T', 'R', 'H', 'D'),
33374
20285793cdef Support S302M in the native ts demuxer.
cehoyos
parents: 33338
diff changeset
85 AUDIO_S302M = mmioFOURCC('B', 'S', 'S', 'D'),
35012
144d16d56b45 TS demuxer: Add support for PCM variant found on BluRay.
reimar
parents: 34776
diff changeset
86 AUDIO_PCM_BR = mmioFOURCC('B', 'P', 'C', 'M'),
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
87 SPU_DVD = 0x3000000,
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
88 SPU_DVB = 0x3000001,
29502
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
89 SPU_TELETEXT = 0x3000002,
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
90 SPU_PGS = 0x3000003,
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
91 PES_PRIVATE1 = 0xBD00000,
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
92 SL_PES_STREAM = 0xD000000,
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
93 SL_SECTION = 0xD100000,
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
94 MP4_OD = 0xD200000,
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
95 } es_stream_type_t;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
96
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
97 typedef struct {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
98 uint8_t *buffer;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
99 uint16_t buffer_len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
100 } ts_section_t;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
101
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
102 typedef struct {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
103 int size;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
104 unsigned char *start;
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
105 uint16_t payload_size;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
106 es_stream_type_t type, subtype;
30256
c116c83f6268 Use double instead of float for pts.
cehoyos
parents: 30088
diff changeset
107 double pts, last_pts;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
108 int pid;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
109 char lang[4];
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
110 int last_cc; // last cc code (-1 if first packet)
14981
293d3dee2eae SL payloads are pushed to audio and video fifo only when they are flagged with random_accesspoint or access_unit_start
nicodvb
parents: 14968
diff changeset
111 int is_synced;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
112 ts_section_t section;
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
113 uint8_t *extradata;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
114 int extradata_alloc, extradata_len;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
115 struct {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
116 uint8_t au_start, au_end, last_au_end;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
117 } sl;
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
118 } ES_stream_t;
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
119
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
120 typedef struct {
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
121 void *sh;
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
122 int id;
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
123 int type;
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
124 } sh_av_t;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
125
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
126 typedef struct MpegTSContext {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
127 int packet_size; // raw packet size, including FEC if present e.g. 188 bytes
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
128 ES_stream_t *pids[NB_PID_MAX];
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
129 sh_av_t streams[NB_PID_MAX];
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
130 } MpegTSContext;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
131
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
132
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
133 typedef struct {
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
134 demux_stream_t *ds;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
135 demux_packet_t *pack;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
136 int offset, buffer_size;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
137 } av_fifo_t;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
138
18462
557d188e915a raised max extradata size and refuse to store more than the limit
nicodvb
parents: 18461
diff changeset
139 #define MAX_EXTRADATA_SIZE 64*1024
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
140 typedef struct {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
141 int32_t object_type; //aka codec used
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
142 int32_t stream_type; //video, audio etc.
18462
557d188e915a raised max extradata size and refuse to store more than the limit
nicodvb
parents: 18461
diff changeset
143 uint8_t buf[MAX_EXTRADATA_SIZE];
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
144 uint16_t buf_size;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
145 uint8_t szm1;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
146 } mp4_decoder_config_t;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
147
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
148 typedef struct {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
149 //flags
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
150 uint8_t flags;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
151 uint8_t au_start;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
152 uint8_t au_end;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
153 uint8_t random_accesspoint;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
154 uint8_t random_accesspoint_only;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
155 uint8_t padding;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
156 uint8_t use_ts;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
157 uint8_t idle;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
158 uint8_t duration;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
159
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
160 uint32_t ts_resolution, ocr_resolution;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
161 uint8_t ts_len, ocr_len, au_len, instant_bitrate_len, degr_len, au_seqnum_len, packet_seqnum_len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
162 uint32_t timescale;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
163 uint16_t au_duration, cts_duration;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
164 uint64_t ocr, dts, cts;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
165 } mp4_sl_config_t;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
166
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
167 typedef struct {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
168 uint16_t id;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
169 uint8_t flags;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
170 mp4_decoder_config_t decoder;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
171 mp4_sl_config_t sl;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
172 } mp4_es_descr_t;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
173
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
174 typedef struct {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
175 uint16_t id;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
176 uint8_t flags;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
177 mp4_es_descr_t *es;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
178 uint16_t es_cnt;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
179 } mp4_od_t;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
180
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
181 typedef struct {
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
182 uint8_t skip;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
183 uint8_t table_id;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
184 uint8_t ssi;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
185 uint16_t section_length;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
186 uint16_t ts_id;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
187 uint8_t version_number;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
188 uint8_t curr_next;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
189 uint8_t section_number;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
190 uint8_t last_section_number;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
191 struct pat_progs_t {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
192 uint16_t id;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
193 uint16_t pmt_pid;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
194 } *progs;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
195 uint16_t progs_cnt;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
196 ts_section_t section;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
197 } pat_t;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
198
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
199 typedef struct {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
200 uint16_t progid;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
201 uint8_t skip;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
202 uint8_t table_id;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
203 uint8_t ssi;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
204 uint16_t section_length;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
205 uint8_t version_number;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
206 uint8_t curr_next;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
207 uint8_t section_number;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
208 uint8_t last_section_number;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
209 uint16_t PCR_PID;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
210 uint16_t prog_descr_length;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
211 ts_section_t section;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
212 uint16_t es_cnt;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
213 struct pmt_es_t {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
214 uint16_t pid;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
215 uint32_t type; //it's 8 bit long, but cast to the right type as FOURCC
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
216 uint16_t descr_length;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
217 uint8_t format_descriptor[5];
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
218 uint8_t lang[4];
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
219 uint16_t mp4_es_id;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
220 } *es;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
221 mp4_od_t iod, *od;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
222 mp4_es_descr_t *mp4es;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
223 int od_cnt, mp4es_cnt;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
224 } pmt_t;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
225
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
226 typedef struct {
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
227 uint64_t size;
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
228 float duration;
30256
c116c83f6268 Use double instead of float for pts.
cehoyos
parents: 30088
diff changeset
229 double first_pts;
c116c83f6268 Use double instead of float for pts.
cehoyos
parents: 30088
diff changeset
230 double last_pts;
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
231 } TS_stream_info;
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
232
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
233 typedef struct {
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
234 MpegTSContext ts;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
235 int last_pid;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
236 av_fifo_t fifo[3]; //0 for audio, 1 for video, 2 for subs
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
237 pat_t pat;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
238 pmt_t *pmt;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
239 uint16_t pmt_cnt;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
240 uint32_t prog;
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
241 uint32_t vbitrate;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
242 int keep_broken;
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
243 int last_aid;
20951
55798b61b8ca implemented DEMUXER_CTRL_SWITCH_VIDEO
nicodvb
parents: 20508
diff changeset
244 int last_vid;
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
245 int last_sid;
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
246 char packet[TS_FEC_PACKET_SIZE];
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
247 TS_stream_info vstr, astr;
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
248 } ts_priv_t;
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
249
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
250
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
251 typedef struct {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
252 es_stream_type_t type;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
253 ts_section_t section;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
254 } TS_pids_t;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
255
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
256
31474
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
257 static int IS_AUDIO(es_stream_type_t type)
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
258 {
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
259 switch (type) {
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
260 case AUDIO_MP2:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
261 case AUDIO_A52:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
262 case AUDIO_LPCM_BE:
35012
144d16d56b45 TS demuxer: Add support for PCM variant found on BluRay.
reimar
parents: 34776
diff changeset
263 case AUDIO_PCM_BR:
31474
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
264 case AUDIO_AAC:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
265 case AUDIO_AAC_LATM:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
266 case AUDIO_DTS:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
267 case AUDIO_TRUEHD:
33374
20285793cdef Support S302M in the native ts demuxer.
cehoyos
parents: 33338
diff changeset
268 case AUDIO_S302M:
31474
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
269 return 1;
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
270 }
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
271 return 0;
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
272 }
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
273
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
274 static int IS_VIDEO(es_stream_type_t type)
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
275 {
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
276 switch (type) {
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
277 case VIDEO_MPEG1:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
278 case VIDEO_MPEG2:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
279 case VIDEO_MPEG4:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
280 case VIDEO_H264:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
281 case VIDEO_AVC:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
282 case VIDEO_DIRAC:
36379
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
283 case VIDEO_HEVC:
31474
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
284 case VIDEO_VC1:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
285 return 1;
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
286 }
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
287 return 0;
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
288 }
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
289
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
290 static int IS_SUB(es_stream_type_t type)
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
291 {
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
292 switch (type) {
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
293 case SPU_DVD:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
294 case SPU_DVB:
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
295 case SPU_PGS:
31474
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
296 case SPU_TELETEXT:
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
297 return 1;
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
298 }
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
299 return 0;
133a32b2a5a5 Replace ever-growing-to-uglyness IS_* macros to by functions
reimar
parents: 31455
diff changeset
300 }
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
301
36568
323fb622da7e demux_ts: remove pointless stack variable and ts_parse argument.
reimar
parents: 36379
diff changeset
302 static int ts_parse(demuxer_t *demuxer, ES_stream_t *es, int probe);
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
303
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
304 static uint8_t get_packet_size(const unsigned char *buf, int size)
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
305 {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
306 int i;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
307
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
308 if (size < (TS_FEC_PACKET_SIZE * NUM_CONSECUTIVE_TS_PACKETS))
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
309 return 0;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
310
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
311 for(i=0; i<NUM_CONSECUTIVE_TS_PACKETS; i++)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
312 {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
313 if (buf[i * TS_PACKET_SIZE] != 0x47)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
314 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
315 mp_msg(MSGT_DEMUX, MSGL_DBG2, "GET_PACKET_SIZE, pos %d, char: %2x\n", i, buf[i * TS_PACKET_SIZE]);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
316 goto try_fec;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
317 }
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
318 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
319 return TS_PACKET_SIZE;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
320
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
321 try_fec:
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
322 for(i=0; i<NUM_CONSECUTIVE_TS_PACKETS; i++)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
323 {
13994
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
324 if (buf[i * TS_FEC_PACKET_SIZE] != 0x47){
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
325 mp_msg(MSGT_DEMUX, MSGL_DBG2, "GET_PACKET_SIZE, pos %d, char: %2x\n", i, buf[i * TS_PACKET_SIZE]);
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
326 goto try_philips;
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
327 }
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
328 }
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
329 return TS_FEC_PACKET_SIZE;
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
330
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
331 try_philips:
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
332 for(i=0; i<NUM_CONSECUTIVE_TS_PACKETS; i++)
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
333 {
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
334 if (buf[i * TS_PH_PACKET_SIZE] != 0x47)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
335 return 0;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
336 }
13994
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
337 return TS_PH_PACKET_SIZE;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
338 }
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
339
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
340 static int parse_avc_sps(uint8_t *buf, int len, int *w, int *h);
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
341 static uint8_t *pid_lang_from_pmt(ts_priv_t *priv, int pid);
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
342
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
343 static void ts_add_stream(demuxer_t * demuxer, ES_stream_t *es)
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
344 {
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
345 int i;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
346 ts_priv_t *priv = (ts_priv_t*) demuxer->priv;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
347
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
348 if(priv->ts.streams[es->pid].sh)
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
349 return;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
350
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
351 if((IS_AUDIO(es->type) || IS_AUDIO(es->subtype)) && priv->last_aid+1 < MAX_A_STREAMS)
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
352 {
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31605
diff changeset
353 sh_audio_t *sh = new_sh_audio_aid(demuxer, priv->last_aid, es->pid, pid_lang_from_pmt(priv, es->pid));
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
354 if(sh)
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
355 {
30088
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29661
diff changeset
356 sh->needs_parsing = 1;
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
357 sh->format = IS_AUDIO(es->type) ? es->type : es->subtype;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
358
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
359 priv->ts.streams[es->pid].id = priv->last_aid;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
360 priv->ts.streams[es->pid].sh = sh;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
361 priv->ts.streams[es->pid].type = TYPE_AUDIO;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
362 mp_msg(MSGT_DEMUX, MSGL_V, "\r\nADDED AUDIO PID %d, type: %x stream n. %d\r\n", es->pid, sh->format, priv->last_aid);
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
363 priv->last_aid++;
35254
3828cde710a2 Fix crash in case sh_audio allocation failed.
reimar
parents: 35224
diff changeset
364
3828cde710a2 Fix crash in case sh_audio allocation failed.
reimar
parents: 35224
diff changeset
365 if(es->extradata && es->extradata_len)
3828cde710a2 Fix crash in case sh_audio allocation failed.
reimar
parents: 35224
diff changeset
366 {
3828cde710a2 Fix crash in case sh_audio allocation failed.
reimar
parents: 35224
diff changeset
367 sh->wf = malloc(sizeof(*sh->wf) + es->extradata_len);
3828cde710a2 Fix crash in case sh_audio allocation failed.
reimar
parents: 35224
diff changeset
368 sh->wf->cbSize = es->extradata_len;
3828cde710a2 Fix crash in case sh_audio allocation failed.
reimar
parents: 35224
diff changeset
369 memcpy(sh->wf + 1, es->extradata, es->extradata_len);
3828cde710a2 Fix crash in case sh_audio allocation failed.
reimar
parents: 35224
diff changeset
370 }
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
371 }
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
372 }
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
373
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
374 if((IS_VIDEO(es->type) || IS_VIDEO(es->subtype)) && priv->last_vid+1 < MAX_V_STREAMS)
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
375 {
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
376 sh_video_t *sh = new_sh_video_vid(demuxer, priv->last_vid, es->pid);
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
377 if(sh)
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
378 {
28576
a6b506faeb34 Replace double semicolon by single semicolon.
diego
parents: 28313
diff changeset
379 sh->format = IS_VIDEO(es->type) ? es->type : es->subtype;
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
380
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
381 priv->ts.streams[es->pid].id = priv->last_vid;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
382 priv->ts.streams[es->pid].sh = sh;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
383 priv->ts.streams[es->pid].type = TYPE_VIDEO;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
384 mp_msg(MSGT_DEMUX, MSGL_V, "\r\nADDED VIDEO PID %d, type: %x stream n. %d\r\n", es->pid, sh->format, priv->last_vid);
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
385 priv->last_vid++;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
386
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
387
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
388 if(sh->format == VIDEO_AVC && es->extradata && es->extradata_len)
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
389 {
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
390 int w = 0, h = 0;
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
391 sh->bih = calloc(1, sizeof(*sh->bih) + es->extradata_len);
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 32060
diff changeset
392 sh->bih->biSize= sizeof(*sh->bih) + es->extradata_len;
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
393 sh->bih->biCompression = sh->format;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
394 memcpy(sh->bih + 1, es->extradata, es->extradata_len);
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
395 mp_msg(MSGT_DEMUXER,MSGL_DBG2, "EXTRADATA(%d BYTES): \n", es->extradata_len);
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
396 for(i = 0;i < es->extradata_len; i++)
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
397 mp_msg(MSGT_DEMUXER,MSGL_DBG2, "%02x ", (int) es->extradata[i]);
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
398 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"\n");
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
399 if(parse_avc_sps(es->extradata, es->extradata_len, &w, &h))
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
400 {
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
401 sh->bih->biWidth = w;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
402 sh->bih->biHeight = h;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
403 }
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
404 }
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
405 }
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
406 }
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
407
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
408 if(IS_SUB(es->type) && priv->last_sid+1 < MAX_S_STREAMS)
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
409 {
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
410 sh_sub_t *sh = new_sh_sub_sid(demuxer, priv->last_sid, es->pid, pid_lang_from_pmt(priv, es->pid));
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
411 if (sh) {
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
412 switch (es->type) {
32775
3e141cd16ef3 Set subtitle stream type correctly for DVB subtitles in TS demuxer.
reimar
parents: 32610
diff changeset
413 case SPU_DVB:
3e141cd16ef3 Set subtitle stream type correctly for DVB subtitles in TS demuxer.
reimar
parents: 32610
diff changeset
414 sh->type = 'b'; break;
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
415 case SPU_DVD:
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
416 sh->type = 'v'; break;
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
417 case SPU_PGS:
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
418 sh->type = 'p'; break;
34776
0da7375c9b61 Make teletext sub streams actually work with native TS demuxer.
reimar
parents: 33374
diff changeset
419 case SPU_TELETEXT:
0da7375c9b61 Make teletext sub streams actually work with native TS demuxer.
reimar
parents: 33374
diff changeset
420 sh->type = 'd'; break;
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
421 }
32359
3f8dcfb95845 Fix switching audio track with the native MPEG-TS demuxer after an
cehoyos
parents: 32345
diff changeset
422 priv->ts.streams[es->pid].id = priv->last_sid;
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
423 priv->ts.streams[es->pid].sh = sh;
32359
3f8dcfb95845 Fix switching audio track with the native MPEG-TS demuxer after an
cehoyos
parents: 32345
diff changeset
424 priv->ts.streams[es->pid].type = TYPE_SUB;
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
425 priv->last_sid++;
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
426 }
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
427 }
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
428 }
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
429
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
430 static int ts_check_file(demuxer_t * demuxer)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
431 {
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
432 const int buf_size = (TS_FEC_PACKET_SIZE * NUM_CONSECUTIVE_TS_PACKETS);
10841
d4cf5407d7c6 Fix a gcc 3.x crash when compiling demux_ts.c with -g -O4 (or -O3). Patch by Arpi.
mosu
parents: 10735
diff changeset
433 unsigned char buf[TS_FEC_PACKET_SIZE * NUM_CONSECUTIVE_TS_PACKETS], done = 0, *ptr;
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
434 uint32_t _read, i, count = 0, is_ts;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
435 int cc[NB_PID_MAX], last_cc[NB_PID_MAX], pid, cc_ok, c, good, bad;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
436 uint8_t size = 0;
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
437 off_t pos = 0;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
438 off_t init_pos;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
439
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
440 mp_msg(MSGT_DEMUX, MSGL_V, "Checking for MPEG-TS...\n");
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
441
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
442 init_pos = stream_tell(demuxer->stream);
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
443 is_ts = 0;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
444 while(! done)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
445 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
446 i = 1;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
447 c = 0;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
448
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
449 while(((c=stream_read_char(demuxer->stream)) != 0x47)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
450 && (c >= 0)
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
451 && (i < MAX_CHECK_SIZE)
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
452 && ! demuxer->stream->eof
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
453 ) i++;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
454
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
455
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
456 if(c != 0x47)
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
457 {
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
458 mp_msg(MSGT_DEMUX, MSGL_V, "THIS DOESN'T LOOK LIKE AN MPEG-TS FILE!\n");
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
459 is_ts = 0;
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
460 done = 1;
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
461 continue;
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
462 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
463
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
464 pos = stream_tell(demuxer->stream) - 1;
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
465 buf[0] = c;
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
466 _read = stream_read(demuxer->stream, &buf[1], buf_size-1);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
467
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
468 if(_read < buf_size-1)
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
469 {
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
470 mp_msg(MSGT_DEMUX, MSGL_V, "COULDN'T READ ENOUGH DATA, EXITING TS_CHECK\n");
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
471 stream_reset(demuxer->stream);
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
472 return 0;
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
473 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
474
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
475 size = get_packet_size(buf, buf_size);
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
476 if(size)
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
477 {
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
478 done = 1;
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
479 is_ts = 1;
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
480 }
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
481
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
482 if(pos - init_pos >= MAX_CHECK_SIZE)
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
483 {
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
484 done = 1;
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
485 is_ts = 0;
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
486 }
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
487 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
488
16750
0a31740dd5e6 Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents: 16292
diff changeset
489 mp_msg(MSGT_DEMUX, MSGL_V, "TRIED UP TO POSITION %"PRIu64", FOUND %x, packet_size= %d, SEEMS A TS? %d\n", (uint64_t) pos, c, size, is_ts);
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
490 stream_seek(demuxer->stream, pos);
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
491
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
492 if(! is_ts)
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
493 return 0;
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
494
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
495 //LET'S CHECK continuity counters
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
496 good = bad = 0;
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
497 for(count = 0; count < NB_PID_MAX; count++)
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
498 {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
499 cc[count] = last_cc[count] = -1;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
500 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
501
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
502 for(count = 0; count < NUM_CONSECUTIVE_TS_PACKETS; count++)
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
503 {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
504 ptr = &(buf[size * count]);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
505 pid = ((ptr[1] & 0x1f) << 8) | ptr[2];
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
506 mp_msg(MSGT_DEMUX, MSGL_DBG2, "BUF: %02x %02x %02x %02x, PID %d, SIZE: %d \n",
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
507 ptr[0], ptr[1], ptr[2], ptr[3], pid, size);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
508
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
509 if((pid == 8191) || (pid < 16))
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
510 continue;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
511
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
512 cc[pid] = (ptr[3] & 0xf);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
513 cc_ok = (last_cc[pid] < 0) || ((((last_cc[pid] + 1) & 0x0f) == cc[pid]));
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
514 mp_msg(MSGT_DEMUX, MSGL_DBG2, "PID %d, COMPARE CC %d AND LAST_CC %d\n", pid, cc[pid], last_cc[pid]);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
515 if(! cc_ok)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
516 //return 0;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
517 bad++;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
518 else
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
519 good++;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
520
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
521 last_cc[pid] = cc[pid];
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
522 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
523
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
524 mp_msg(MSGT_DEMUX, MSGL_V, "GOOD CC: %d, BAD CC: %d\n", good, bad);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
525
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
526 if(good >= bad)
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
527 return size;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
528 else
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
529 return 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
530 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
531
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
532
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
533 static int32_t progid_idx_in_pmt(ts_priv_t *priv, uint16_t progid)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
534 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
535 int x;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
536
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
537 if(priv->pmt == NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
538 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
539
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
540 for(x = 0; x < priv->pmt_cnt; x++)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
541 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
542 if(priv->pmt[x].progid == progid)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
543 return x;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
544 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
545
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
546 return -1;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
547 }
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
548
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
549
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
550 static int32_t progid_for_pid(ts_priv_t *priv, int pid, int32_t req) //finds the first program listing a pid
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
551 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
552 int i, j;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
553 pmt_t *pmt;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
554
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
555
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
556 if(priv->pmt == NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
557 return -1;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
558
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
559
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
560 for(i=0; i < priv->pmt_cnt; i++)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
561 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
562 pmt = &(priv->pmt[i]);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
563
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
564 if(pmt->es == NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
565 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
566
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
567 for(j = 0; j < pmt->es_cnt; j++)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
568 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
569 if(pmt->es[j].pid == pid)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
570 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
571 if((req == 0) || (req == pmt->progid))
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
572 return pmt->progid;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
573 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
574 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
575
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
576 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
577 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
578 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
579
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
580 static int32_t prog_pcr_pid(ts_priv_t *priv, int progid)
26038
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
581 {
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
582 int i;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
583
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
584 if(priv->pmt == NULL)
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
585 return -1;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
586 for(i=0; i < priv->pmt_cnt; i++)
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
587 {
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
588 if(priv->pmt[i].progid == progid)
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
589 return priv->pmt[i].PCR_PID;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
590 }
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
591 return -1;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
592 }
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
593
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
594
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
595 static int pid_match_lang(ts_priv_t *priv, uint16_t pid, char *lang)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
596 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
597 uint16_t i, j;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
598 pmt_t *pmt;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
599
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
600 if(priv->pmt == NULL)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
601 return -1;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
602
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
603 for(i=0; i < priv->pmt_cnt; i++)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
604 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
605 pmt = &(priv->pmt[i]);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
606
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
607 if(pmt->es == NULL)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
608 return -1;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
609
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
610 for(j = 0; j < pmt->es_cnt; j++)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
611 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
612 if(pmt->es[j].pid != pid)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
613 continue;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
614
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
615 mp_msg(MSGT_DEMUXER, MSGL_V, "CMP LANG %s AND %s, pids: %d %d\n",pmt->es[j].lang, lang, pmt->es[j].pid, pid);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
616 if(strncmp(pmt->es[j].lang, lang, 3) == 0)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
617 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
618 return 1;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
619 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
620 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
621
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
622 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
623
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
624 return -1;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
625 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
626
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
627 typedef struct {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
628 int32_t atype, vtype, stype; //types
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
629 int32_t apid, vpid, spid; //stream ids
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
630 char alang[4]; //languages
23427
2e79a9d381dc prog_id is an uint16_t; reported by Mario Rossi (mariofurire googlemail com)
nicodvb
parents: 22605
diff changeset
631 uint16_t prog;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
632 off_t probe;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
633 } tsdemux_init_t;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
634
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
635 //second stage: returns the count of A52 syncwords found
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
636 static int a52_check(char *buf, int len)
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
637 {
31797
895706bb6e5c Initialize frame_length variable to zero to avoid the warning:
diego
parents: 31658
diff changeset
638 int cnt, frame_length = 0, ok, srate;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
639
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
640 cnt = ok = 0;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
641 if(len < 8)
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
642 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
643
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
644 while(cnt < len - 7)
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
645 {
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
646 if(buf[cnt] == 0x0B && buf[cnt+1] == 0x77)
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
647 {
17492
3f420548c0ca export custom mp_a52_framesize(), needed to parse ac3 frames when liba52 is not present; will be moved in a more appropriate place sometimes in the future
nicodvb
parents: 17367
diff changeset
648 frame_length = mp_a52_framesize(&buf[cnt], &srate);
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
649 if(frame_length>=7 && frame_length<=3840)
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
650 {
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
651 cnt += frame_length;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
652 ok++;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
653 }
13581
ffed770f7564 fixed a bug that makes the demuxer loop forever probing a52 audio when a52_syncinfo() returns 0
nicodvb
parents: 13579
diff changeset
654 else
ffed770f7564 fixed a bug that makes the demuxer loop forever probing a52 audio when a52_syncinfo() returns 0
nicodvb
parents: 13579
diff changeset
655 cnt++;
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
656 }
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
657 else
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
658 cnt++;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
659 }
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
660
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
661 mp_msg(MSGT_DEMUXER, MSGL_V, "A52_CHECK(%d input bytes), found %d frame syncwords of %d bytes length\n", len, ok, frame_length);
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
662 return ok;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
663 }
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
664
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
665
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
666 static off_t ts_detect_streams(demuxer_t *demuxer, tsdemux_init_t *param)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
667 {
33338
4cf10c6071fd Remove unused variable.
reimar
parents: 33184
diff changeset
668 int video_found = 0, audio_found = 0, i, num_packets = 0, req_apid, req_vpid, req_spid;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
669 int is_audio, is_video, is_sub, has_tables;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
670 int32_t p, chosen_pid = 0;
23509
53d57a0ebe13 init ts_probe to 0 and probe up to TS_MAX_PROBE_SIZE if the parameter
nicodvb
parents: 23507
diff changeset
671 off_t pos=0, ret = 0, init_pos, end_pos;
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
672 ES_stream_t es;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
673 ts_priv_t *priv = (ts_priv_t*) demuxer->priv;
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
674 struct {
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
675 char *buf;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
676 int pos;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
677 } pes_priv1[8192], *pptr;
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
678 char *tmpbuf;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
679
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
680 priv->last_pid = 8192; //invalid pid
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
681
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
682 req_apid = param->apid;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
683 req_vpid = param->vpid;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
684 req_spid = param->spid;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
685
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
686 has_tables = 0;
14571
512a57bbe68d replaced bzero() with memset(); stream_type 0x0f is AAC
nicodvb
parents: 14046
diff changeset
687 memset(pes_priv1, 0, sizeof(pes_priv1));
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
688 init_pos = stream_tell(demuxer->stream);
18714
8fc996a3b4e1 reduced standard verbosity and changed output messages to more uniform descriptions
nicodvb
parents: 18688
diff changeset
689 mp_msg(MSGT_DEMUXER, MSGL_V, "PROBING UP TO %"PRIu64", PROG: %d\n", (uint64_t) param->probe, param->prog);
23509
53d57a0ebe13 init ts_probe to 0 and probe up to TS_MAX_PROBE_SIZE if the parameter
nicodvb
parents: 23507
diff changeset
690 end_pos = init_pos + (param->probe ? param->probe : TS_MAX_PROBE_SIZE);
24569
bc5dfd30626d in ts_detect_streams() moved the iteration condition inside the loop
nicodvb
parents: 24424
diff changeset
691 while(1)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
692 {
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
693 pos = stream_tell(demuxer->stream);
24569
bc5dfd30626d in ts_detect_streams() moved the iteration condition inside the loop
nicodvb
parents: 24424
diff changeset
694 if(pos > end_pos || demuxer->stream->eof)
bc5dfd30626d in ts_detect_streams() moved the iteration condition inside the loop
nicodvb
parents: 24424
diff changeset
695 break;
bc5dfd30626d in ts_detect_streams() moved the iteration condition inside the loop
nicodvb
parents: 24424
diff changeset
696
36568
323fb622da7e demux_ts: remove pointless stack variable and ts_parse argument.
reimar
parents: 36379
diff changeset
697 if(ts_parse(demuxer, &es, 1))
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
698 {
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
699 //Non PES-aligned A52 audio may escape detection if PMT is not present;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
700 //in this case we try to find at least 3 A52 syncwords
20283
385f4a815e75 fixed corner case previously mishandled: don't play an audio only stream when
nicodvb
parents: 20213
diff changeset
701 if((es.type == PES_PRIVATE1) && (! audio_found) && req_apid > -2)
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
702 {
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
703 pptr = &pes_priv1[es.pid];
18474
5262ede8f2e1 when searching ac3 in unqualified pes_private1 streams there's no need to scan > 64 KB of data: frames can't be so far apart
nicodvb
parents: 18464
diff changeset
704 if(pptr->pos < 64*1024)
5262ede8f2e1 when searching ac3 in unqualified pes_private1 streams there's no need to scan > 64 KB of data: frames can't be so far apart
nicodvb
parents: 18464
diff changeset
705 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30579
diff changeset
706 tmpbuf = realloc(pptr->buf, pptr->pos + es.size);
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
707 if(tmpbuf != NULL)
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
708 {
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
709 pptr->buf = tmpbuf;
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
710 memcpy(&(pptr->buf[ pptr->pos ]), es.start, es.size);
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
711 pptr->pos += es.size;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
712 if(a52_check(pptr->buf, pptr->pos) > 2)
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
713 {
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
714 param->atype = AUDIO_A52;
18043
97aa495df9dd segfault fix: assign param->apid (that is the audio id found) when inexistent audio language is specified; patch by Erik Auerswald auerswal a unix-ag d uni-kl d de
nicodvb
parents: 17816
diff changeset
715 param->apid = es.pid;
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
716 es.type = AUDIO_A52;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
717 }
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
718 }
18474
5262ede8f2e1 when searching ac3 in unqualified pes_private1 streams there's no need to scan > 64 KB of data: frames can't be so far apart
nicodvb
parents: 18464
diff changeset
719 }
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
720 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
721
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
722 is_audio = IS_AUDIO(es.type) || ((es.type==SL_PES_STREAM) && IS_AUDIO(es.subtype));
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
723 is_video = IS_VIDEO(es.type) || ((es.type==SL_PES_STREAM) && IS_VIDEO(es.subtype));
29502
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
724 is_sub = IS_SUB(es.type);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
725
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
726
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
727 if((! is_audio) && (! is_video) && (! is_sub))
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
728 continue;
20283
385f4a815e75 fixed corner case previously mishandled: don't play an audio only stream when
nicodvb
parents: 20213
diff changeset
729 if(is_audio && req_apid==-2)
385f4a815e75 fixed corner case previously mishandled: don't play an audio only stream when
nicodvb
parents: 20213
diff changeset
730 continue;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
731
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
732 if(is_video)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
733 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
734 chosen_pid = (req_vpid == es.pid);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
735 if((! chosen_pid) && (req_vpid > 0))
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
736 continue;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
737 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
738 else if(is_audio)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
739 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
740 if(req_apid > 0)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
741 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
742 chosen_pid = (req_apid == es.pid);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
743 if(! chosen_pid)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
744 continue;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
745 }
23835
eb2cce132396 Fix for bugzilla #835
rtogni
parents: 23509
diff changeset
746 else if(param->alang[0] > 0 && es.lang[0] > 0)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
747 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
748 if(pid_match_lang(priv, es.pid, param->alang) == -1)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
749 continue;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
750
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
751 chosen_pid = 1;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
752 param->apid = req_apid = es.pid;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
753 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
754 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
755 else if(is_sub)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
756 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
757 chosen_pid = (req_spid == es.pid);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
758 if((! chosen_pid) && (req_spid > 0))
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
759 continue;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
760 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
761
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
762 if(req_apid < 0 && (param->alang[0] == 0) && req_vpid < 0 && req_spid < 0)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
763 chosen_pid = 1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
764
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
765 if((ret == 0) && chosen_pid)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
766 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
767 ret = stream_tell(demuxer->stream);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
768 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
769
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
770 p = progid_for_pid(priv, es.pid, param->prog);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
771 if(p != -1)
25975
90207684e2d8 cosmetics
nicodvb
parents: 25974
diff changeset
772 {
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
773 has_tables++;
25975
90207684e2d8 cosmetics
nicodvb
parents: 25974
diff changeset
774 if(!param->prog && chosen_pid)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
775 param->prog = p;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
776 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
777
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
778 if((param->prog > 0) && (param->prog != p))
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
779 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
780 if(audio_found)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
781 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
782 if(is_video && (req_vpid == es.pid))
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
783 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
784 param->vtype = IS_VIDEO(es.type) ? es.type : es.subtype;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
785 param->vpid = es.pid;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
786 video_found = 1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
787 break;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
788 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
789 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
790
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
791 if(video_found)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
792 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
793 if(is_audio && (req_apid == es.pid))
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
794 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
795 param->atype = IS_AUDIO(es.type) ? es.type : es.subtype;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
796 param->apid = es.pid;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
797 audio_found = 1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
798 break;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
799 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
800 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
801
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
802
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
803 continue;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
804 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
805
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
806
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
807 mp_msg(MSGT_DEMUXER, MSGL_DBG2, "TYPE: %x, PID: %d, PROG FOUND: %d\n", es.type, es.pid, param->prog);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
808
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
809
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
810 if(is_video)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
811 {
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
812 if((req_vpid == -1) || (req_vpid == es.pid))
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
813 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
814 param->vtype = IS_VIDEO(es.type) ? es.type : es.subtype;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
815 param->vpid = es.pid;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
816 video_found = 1;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
817 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
818 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
819
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
820
23509
53d57a0ebe13 init ts_probe to 0 and probe up to TS_MAX_PROBE_SIZE if the parameter
nicodvb
parents: 23507
diff changeset
821 if(((req_vpid == -2) || (num_packets >= NUM_CONSECUTIVE_AUDIO_PACKETS)) && audio_found && !param->probe)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
822 {
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
823 //novideo or we have at least 348 audio packets (64 KB) without video (TS with audio only)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
824 param->vtype = 0;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
825 break;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
826 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
827
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
828 if(is_sub)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
829 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
830 if((req_spid == -1) || (req_spid == es.pid))
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
831 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
832 param->stype = es.type;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
833 param->spid = es.pid;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
834 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
835 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
836
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
837 if(is_audio)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
838 {
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
839 if((req_apid == -1) || (req_apid == es.pid))
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
840 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
841 param->atype = IS_AUDIO(es.type) ? es.type : es.subtype;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
842 param->apid = es.pid;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
843 audio_found = 1;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
844 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
845 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
846
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
847 if(audio_found && (param->apid == es.pid) && (! video_found))
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
848 num_packets++;
10259
b60e89268837 - discard soon non TS files (previously it took too long, as in the case
arpi
parents: 10253
diff changeset
849
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
850 if((has_tables==0) && (video_found && audio_found) && (pos >= 1000000))
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
851 break;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
852 }
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
853 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
854
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
855 for(i=0; i<8192; i++)
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
856 {
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
857 if(pes_priv1[i].buf != NULL)
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
858 {
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
859 free(pes_priv1[i].buf);
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
860 pes_priv1[i].buf = NULL;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
861 pes_priv1[i].pos = 0;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
862 }
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
863 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
864
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
865 if(video_found)
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
866 {
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
867 if(param->vtype == VIDEO_MPEG1)
18714
8fc996a3b4e1 reduced standard verbosity and changed output messages to more uniform descriptions
nicodvb
parents: 18688
diff changeset
868 mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO MPEG1(pid=%d) ", param->vpid);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
869 else if(param->vtype == VIDEO_MPEG2)
18714
8fc996a3b4e1 reduced standard verbosity and changed output messages to more uniform descriptions
nicodvb
parents: 18688
diff changeset
870 mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO MPEG2(pid=%d) ", param->vpid);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
871 else if(param->vtype == VIDEO_MPEG4)
18714
8fc996a3b4e1 reduced standard verbosity and changed output messages to more uniform descriptions
nicodvb
parents: 18688
diff changeset
872 mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO MPEG4(pid=%d) ", param->vpid);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
873 else if(param->vtype == VIDEO_H264)
18714
8fc996a3b4e1 reduced standard verbosity and changed output messages to more uniform descriptions
nicodvb
parents: 18688
diff changeset
874 mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO H264(pid=%d) ", param->vpid);
22162
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
875 else if(param->vtype == VIDEO_VC1)
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
876 mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO VC1(pid=%d) ", param->vpid);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
877 else if(param->vtype == VIDEO_AVC)
18714
8fc996a3b4e1 reduced standard verbosity and changed output messages to more uniform descriptions
nicodvb
parents: 18688
diff changeset
878 mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO AVC(NAL-H264, pid=%d) ", param->vpid);
36379
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
879 else if(param->vtype == VIDEO_HEVC)
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
880 mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO HEVC(pid=%d) ", param->vpid);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
881 }
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
882 else
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
883 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
884 param->vtype = UNKNOWN;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
885 //WE DIDN'T MATCH ANY VIDEO STREAM
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
886 mp_msg(MSGT_DEMUXER, MSGL_INFO, "NO VIDEO! ");
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
887 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
888
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
889 if(param->atype == AUDIO_MP2)
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
890 mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO MPA(pid=%d)", param->apid);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
891 else if(param->atype == AUDIO_A52)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
892 mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO A52(pid=%d)", param->apid);
18565
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
893 else if(param->atype == AUDIO_DTS)
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
894 mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO DTS(pid=%d)", param->apid);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
895 else if(param->atype == AUDIO_LPCM_BE)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
896 mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO LPCM(pid=%d)", param->apid);
35012
144d16d56b45 TS demuxer: Add support for PCM variant found on BluRay.
reimar
parents: 34776
diff changeset
897 else if(param->atype == AUDIO_PCM_BR)
144d16d56b45 TS demuxer: Add support for PCM variant found on BluRay.
reimar
parents: 34776
diff changeset
898 mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO PCMBR(pid=%d)", param->apid);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
899 else if(param->atype == AUDIO_AAC)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
900 mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO AAC(pid=%d)", param->apid);
31454
171320c96f2c Make demux_ts detect LATM AAC as a separate type.
reimar
parents: 31261
diff changeset
901 else if(param->atype == AUDIO_AAC_LATM)
171320c96f2c Make demux_ts detect LATM AAC as a separate type.
reimar
parents: 31261
diff changeset
902 mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO AAC LATM(pid=%d)", param->apid);
29415
ed4191b00420 handle TrueHD streams (they are carried in 0xFD PES streams in substream 0x72)
nicodvb
parents: 29339
diff changeset
903 else if(param->atype == AUDIO_TRUEHD)
ed4191b00420 handle TrueHD streams (they are carried in 0xFD PES streams in substream 0x72)
nicodvb
parents: 29339
diff changeset
904 mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO TRUEHD(pid=%d)", param->apid);
33374
20285793cdef Support S302M in the native ts demuxer.
cehoyos
parents: 33338
diff changeset
905 else if(param->atype == AUDIO_S302M)
20285793cdef Support S302M in the native ts demuxer.
cehoyos
parents: 33338
diff changeset
906 mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO S302M(pid=%d)", param->apid);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
907 else
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
908 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
909 audio_found = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
910 param->atype = UNKNOWN;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
911 //WE DIDN'T MATCH ANY AUDIO STREAM, SO WE FORCE THE DEMUXER TO IGNORE AUDIO
33184
02da483d5625 demux_ts: Hint at -tsprobe option when no audio stream is found.
diego
parents: 32779
diff changeset
912 mp_msg(MSGT_DEMUXER, MSGL_INFO, "NO AUDIO! (try increasing -tsprobe)");
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
913 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
914
29502
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
915 if(IS_SUB(param->stype))
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
916 mp_msg(MSGT_DEMUXER, MSGL_INFO, " SUB %s(pid=%d) ", (param->stype==SPU_DVD ? "DVD" : param->stype==SPU_DVB ? "DVB" : "Teletext"), param->spid);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
917 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
918 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
919 param->stype = UNKNOWN;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
920 mp_msg(MSGT_DEMUXER, MSGL_INFO, " NO SUBS (yet)! ");
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
921 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
922
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
923 if(video_found || audio_found)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
924 {
25974
41719f1e663b in ts_detect_streams() try to identify the program found based on vpid and apid if the previous attempts failed for lack of infos
nicodvb
parents: 25930
diff changeset
925 if(!param->prog)
41719f1e663b in ts_detect_streams() try to identify the program found based on vpid and apid if the previous attempts failed for lack of infos
nicodvb
parents: 25930
diff changeset
926 {
41719f1e663b in ts_detect_streams() try to identify the program found based on vpid and apid if the previous attempts failed for lack of infos
nicodvb
parents: 25930
diff changeset
927 p = progid_for_pid(priv, video_found ? param->vpid : param->apid, 0);
41719f1e663b in ts_detect_streams() try to identify the program found based on vpid and apid if the previous attempts failed for lack of infos
nicodvb
parents: 25930
diff changeset
928 if(p != -1)
41719f1e663b in ts_detect_streams() try to identify the program found based on vpid and apid if the previous attempts failed for lack of infos
nicodvb
parents: 25930
diff changeset
929 param->prog = p;
41719f1e663b in ts_detect_streams() try to identify the program found based on vpid and apid if the previous attempts failed for lack of infos
nicodvb
parents: 25930
diff changeset
930 }
41719f1e663b in ts_detect_streams() try to identify the program found based on vpid and apid if the previous attempts failed for lack of infos
nicodvb
parents: 25930
diff changeset
931
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
932 if(demuxer->stream->eof && (ret == 0))
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
933 ret = init_pos;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
934 mp_msg(MSGT_DEMUXER, MSGL_INFO, " PROGRAM N. %d\n", param->prog);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
935 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
936 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
937 mp_msg(MSGT_DEMUXER, MSGL_INFO, "\n");
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
938
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
939
32608
75c7654261d0 Replace hard-coded number for loop limits for array index by
reimar
parents: 32607
diff changeset
940 for(i=0; i<NB_PID_MAX; i++)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
941 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
942 if(priv->ts.pids[i] != NULL)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
943 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
944 priv->ts.pids[i]->payload_size = 0;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
945 priv->ts.pids[i]->pts = priv->ts.pids[i]->last_pts = 0;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
946 priv->ts.pids[i]->last_cc = -1;
14981
293d3dee2eae SL payloads are pushed to audio and video fifo only when they are flagged with random_accesspoint or access_unit_start
nicodvb
parents: 14968
diff changeset
947 priv->ts.pids[i]->is_synced = 0;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
948 }
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
949 }
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
950
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
951 return ret;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
952 }
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
953
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
954 static int parse_avc_sps(uint8_t *buf, int len, int *w, int *h)
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
955 {
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
956 int sps, sps_len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
957 unsigned char *ptr;
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
958 mp_mpeg_header_t picture;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
959 if(len < 6)
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
960 return 0;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
961 sps = buf[5] & 0x1f;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
962 if(!sps)
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
963 return 0;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
964 sps_len = (buf[6] << 8) | buf[7];
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
965 if(!sps_len || (sps_len > len - 8))
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
966 return 0;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
967 ptr = &(buf[8]);
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
968 picture.display_picture_width = picture.display_picture_height = 0;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
969 h264_parse_sps(&picture, ptr, len - 8);
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
970 if(!picture.display_picture_width || !picture.display_picture_height)
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
971 return 0;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
972 *w = picture.display_picture_width;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
973 *h = picture.display_picture_height;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
974 return 1;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
975 }
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
976
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
977 static demuxer_t *demux_open_ts(demuxer_t * demuxer)
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
978 {
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
979 int i;
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
980 uint8_t packet_size;
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
981 sh_video_t *sh_video;
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
982 sh_audio_t *sh_audio;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
983 off_t start_pos;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
984 tsdemux_init_t params;
26298
5222bb9c5500 Remove another useless cast
reimar
parents: 26229
diff changeset
985 ts_priv_t * priv = demuxer->priv;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
986
18714
8fc996a3b4e1 reduced standard verbosity and changed output messages to more uniform descriptions
nicodvb
parents: 18688
diff changeset
987 mp_msg(MSGT_DEMUX, MSGL_V, "DEMUX OPEN, AUDIO_ID: %d, VIDEO_ID: %d, SUBTITLE_ID: %d,\n",
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
988 demuxer->audio->id, demuxer->video->id, demuxer->sub->id);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
989
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
990
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
991 demuxer->type= DEMUXER_TYPE_MPEG_TS;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
992
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
993
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
994 stream_reset(demuxer->stream);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
995
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
996 packet_size = ts_check_file(demuxer);
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
997 if(!packet_size)
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
998 return NULL;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
999
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
1000 priv = calloc(1, sizeof(ts_priv_t));
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1001 if(priv == NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1002 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1003 mp_msg(MSGT_DEMUX, MSGL_FATAL, "DEMUX_OPEN_TS, couldn't allocate enough memory for ts->priv, exit\n");
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1004 return NULL;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1005 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1006
32608
75c7654261d0 Replace hard-coded number for loop limits for array index by
reimar
parents: 32607
diff changeset
1007 for(i=0; i < NB_PID_MAX; i++)
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
1008 {
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
1009 priv->ts.pids[i] = NULL;
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
1010 priv->ts.streams[i].id = -3;
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
1011 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1012 priv->pat.progs = NULL;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1013 priv->pat.progs_cnt = 0;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1014 priv->pat.section.buffer = NULL;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1015 priv->pat.section.buffer_len = 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1016
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1017 priv->pmt = NULL;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1018 priv->pmt_cnt = 0;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1019
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1020 priv->keep_broken = ts_keep_broken;
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
1021 priv->ts.packet_size = packet_size;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1022
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1023
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
1024 demuxer->priv = priv;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1025 if(demuxer->stream->type != STREAMTYPE_FILE)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1026 demuxer->seekable = 1;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1027 else
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1028 demuxer->seekable = 1;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1029
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1030
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1031 params.atype = params.vtype = params.stype = UNKNOWN;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1032 params.apid = demuxer->audio->id;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1033 params.vpid = demuxer->video->id;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1034 params.spid = demuxer->sub->id;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1035 params.prog = ts_prog;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1036 params.probe = ts_probe;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1037
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1038 if(audio_lang != NULL)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1039 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1040 strncpy(params.alang, audio_lang, 3);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1041 params.alang[3] = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1042 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1043 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1044 memset(params.alang, 0, 4);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1045
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1046 start_pos = ts_detect_streams(demuxer, &params);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1047
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1048 demuxer->sub->id = params.spid;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1049 priv->prog = params.prog;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1050
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1051 if(params.vtype != UNKNOWN)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1052 {
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
1053 ts_add_stream(demuxer, priv->ts.pids[params.vpid]);
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
1054 sh_video = priv->ts.streams[params.vpid].sh;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
1055 demuxer->video->id = priv->ts.streams[params.vpid].id;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1056 sh_video->format = params.vtype;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1057 demuxer->video->sh = sh_video;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1058 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1059
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1060 if(params.atype != UNKNOWN)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1061 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1062 ES_stream_t *es = priv->ts.pids[params.apid];
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1063
22049
cb80d1bb7ca8 5l, check that the codec type detected by ts_detect_streams() is actually audio before fixing it in the array
nicodvb
parents: 22048
diff changeset
1064 if(!IS_AUDIO(es->type) && !IS_AUDIO(es->subtype) && IS_AUDIO(params.atype)) es->subtype = params.atype;
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
1065 ts_add_stream(demuxer, priv->ts.pids[params.apid]);
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
1066 sh_audio = priv->ts.streams[params.apid].sh;
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
1067 demuxer->audio->id = priv->ts.streams[params.apid].id;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1068 sh_audio->format = params.atype;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1069 demuxer->audio->sh = sh_audio;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1070 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1071
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1072
18714
8fc996a3b4e1 reduced standard verbosity and changed output messages to more uniform descriptions
nicodvb
parents: 18688
diff changeset
1073 mp_msg(MSGT_DEMUXER,MSGL_V, "Opened TS demuxer, audio: %x(pid %d), video: %x(pid %d)...POS=%"PRIu64", PROBE=%"PRIu64"\n", params.atype, demuxer->audio->id, params.vtype, demuxer->video->id, (uint64_t) start_pos, ts_probe);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1074
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
1075
32548
ffbacc2a87fc Fix TS demuxer with -sb and when -aid stream is not found.
reimar
parents: 32537
diff changeset
1076 start_pos = start_pos <= priv->ts.packet_size ?
ffbacc2a87fc Fix TS demuxer with -sb and when -aid stream is not found.
reimar
parents: 32537
diff changeset
1077 demuxer->stream->start_pos :
ffbacc2a87fc Fix TS demuxer with -sb and when -aid stream is not found.
reimar
parents: 32537
diff changeset
1078 start_pos - priv->ts.packet_size;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1079 demuxer->movi_start = start_pos;
26038
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
1080 demuxer->reference_clock = MP_NOPTS_VALUE;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1081 stream_reset(demuxer->stream);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1082 stream_seek(demuxer->stream, start_pos); //IF IT'S FROM A PIPE IT WILL FAIL, BUT WHO CARES?
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1083
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1084
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1085 priv->last_pid = 8192; //invalid pid
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1086
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1087 for(i = 0; i < 3; i++)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1088 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1089 priv->fifo[i].pack = NULL;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1090 priv->fifo[i].offset = 0;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1091 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1092 priv->fifo[0].ds = demuxer->audio;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1093 priv->fifo[1].ds = demuxer->video;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1094 priv->fifo[2].ds = demuxer->sub;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1095
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1096 priv->fifo[0].buffer_size = 1536;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1097 priv->fifo[1].buffer_size = 32767;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1098 priv->fifo[2].buffer_size = 32767;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1099
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1100 priv->pat.section.buffer_len = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1101 for(i = 0; i < priv->pmt_cnt; i++)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1102 priv->pmt[i].section.buffer_len = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1103
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1104 demuxer->filepos = stream_tell(demuxer->stream);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1105 return demuxer;
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
1106 }
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
1107
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
1108 static void demux_close_ts(demuxer_t * demuxer)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1109 {
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1110 uint16_t i;
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1111 ts_priv_t *priv = (ts_priv_t*) demuxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1112
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1113 if(priv)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1114 {
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32500
diff changeset
1115 free(priv->pat.section.buffer);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32500
diff changeset
1116 free(priv->pat.progs);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1117
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1118 if(priv->pmt)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1119 {
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1120 for(i = 0; i < priv->pmt_cnt; i++)
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1121 {
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32500
diff changeset
1122 free(priv->pmt[i].section.buffer);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32500
diff changeset
1123 free(priv->pmt[i].es);
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1124 }
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1125 free(priv->pmt);
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1126 }
32609
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1127 for (i = 0; i < NB_PID_MAX; i++)
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1128 {
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1129 free(priv->ts.pids[i]);
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1130 priv->ts.pids[i] = NULL;
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1131 }
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1132 for (i = 0; i < 3; i++)
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1133 {
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1134 if (priv->fifo[i].pack)
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1135 free_demux_packet(priv->fifo[i].pack);
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1136 priv->fifo[i].pack = NULL;
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
1137 }
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1138 free(priv);
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1139 }
14825
a2d03a8ea065 50000l: fixed various memleaks; CC discontibuities aren't necessarily error conditions
nicodvb
parents: 14571
diff changeset
1140 demuxer->priv=NULL;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1141 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1142
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1143
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1144 #define getbits mp_getbits
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1145
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1146 static int mp4_parse_sl_packet(pmt_t *pmt, uint8_t *buf, uint16_t packet_len, int pid, ES_stream_t *pes_es)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1147 {
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1148 int i, n, m, mp4_es_id = -1;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1149 uint64_t v = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1150 uint32_t pl_size = 0;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1151 int deg_flag = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1152 mp4_es_descr_t *es = NULL;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1153 mp4_sl_config_t *sl = NULL;
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1154 uint8_t au_start = 0, au_end = 0, rap_flag = 0, ocr_flag = 0, padding = 0, padding_bits = 0, idle = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1155
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1156 pes_es->is_synced = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1157 mp_msg(MSGT_DEMUXER,MSGL_V, "mp4_parse_sl_packet, pid: %d, pmt: %pm, packet_len: %d\n", pid, pmt, packet_len);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1158 if(! pmt || !packet_len)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1159 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1160
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1161 for(i = 0; i < pmt->es_cnt; i++)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1162 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1163 if(pmt->es[i].pid == pid)
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1164 mp4_es_id = pmt->es[i].mp4_es_id;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1165 }
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1166 if(mp4_es_id < 0)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1167 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1168
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1169 for(i = 0; i < pmt->mp4es_cnt; i++)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1170 {
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1171 if(pmt->mp4es[i].id == mp4_es_id)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1172 es = &(pmt->mp4es[i]);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1173 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1174 if(! es)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1175 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1176
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1177 pes_es->subtype = es->decoder.object_type;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1178
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1179 sl = &(es->sl);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1180 if(!sl)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1181 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1182
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1183 //now es is the complete es_descriptor of out mp4 ES stream
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1184 mp_msg(MSGT_DEMUXER,MSGL_DBG2, "ID: %d, FLAGS: 0x%x, subtype: %x\n", es->id, sl->flags, pes_es->subtype);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1185
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1186 n = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1187 if(sl->au_start)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1188 pes_es->sl.au_start = au_start = getbits(buf, n++, 1);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1189 else
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1190 pes_es->sl.au_start = (pes_es->sl.last_au_end ? 1 : 0);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1191 if(sl->au_end)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1192 pes_es->sl.au_end = au_end = getbits(buf, n++, 1);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1193
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1194 if(!sl->au_start && !sl->au_end)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1195 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1196 pes_es->sl.au_start = pes_es->sl.au_end = au_start = au_end = 1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1197 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1198 pes_es->sl.last_au_end = pes_es->sl.au_end;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1199
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1200
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1201 if(sl->ocr_len > 0)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1202 ocr_flag = getbits(buf, n++, 1);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1203 if(sl->idle)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1204 idle = getbits(buf, n++, 1);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1205 if(sl->padding)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1206 padding = getbits(buf, n++, 1);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1207 if(padding)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1208 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1209 padding_bits = getbits(buf, n, 3);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1210 n += 3;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1211 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1212
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1213 if(idle || (padding && !padding_bits))
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1214 {
14981
293d3dee2eae SL payloads are pushed to audio and video fifo only when they are flagged with random_accesspoint or access_unit_start
nicodvb
parents: 14968
diff changeset
1215 pes_es->payload_size = 0;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1216 return -1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1217 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1218
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1219 //(! idle && (!padding || padding_bits != 0)) is true
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1220 n += sl->packet_seqnum_len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1221 if(sl->degr_len)
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1222 deg_flag = getbits(buf, n++, 1);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1223 if(deg_flag)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1224 n += sl->degr_len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1225
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1226 if(ocr_flag)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1227 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1228 n += sl->ocr_len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1229 mp_msg(MSGT_DEMUXER,MSGL_DBG2, "OCR: %d bits\n", sl->ocr_len);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1230 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1231
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1232 if(packet_len * 8 <= n)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1233 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1234
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1235 mp_msg(MSGT_DEMUXER,MSGL_DBG2, "\nAU_START: %d, AU_END: %d\n", au_start, au_end);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1236 if(au_start)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1237 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1238 int dts_flag = 0, cts_flag = 0, ib_flag = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1239
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1240 if(sl->random_accesspoint)
14981
293d3dee2eae SL payloads are pushed to audio and video fifo only when they are flagged with random_accesspoint or access_unit_start
nicodvb
parents: 14968
diff changeset
1241 rap_flag = getbits(buf, n++, 1);
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1242
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1243 //check commented because it seems it's rarely used, and we need this flag set in case of au_start
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1244 //the decoder will eventually discard the payload if it can't decode it
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1245 //if(rap_flag || sl->random_accesspoint_only)
14981
293d3dee2eae SL payloads are pushed to audio and video fifo only when they are flagged with random_accesspoint or access_unit_start
nicodvb
parents: 14968
diff changeset
1246 pes_es->is_synced = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1247
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1248 n += sl->au_seqnum_len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1249 if(packet_len * 8 <= n+8)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1250 return -1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1251 if(sl->use_ts)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1252 {
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1253 dts_flag = getbits(buf, n++, 1);
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1254 cts_flag = getbits(buf, n++, 1);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1255 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1256 if(sl->instant_bitrate_len)
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1257 ib_flag = getbits(buf, n++, 1);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1258 if(packet_len * 8 <= n+8)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1259 return -1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1260 if(dts_flag && (sl->ts_len > 0))
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1261 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1262 n += sl->ts_len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1263 mp_msg(MSGT_DEMUXER,MSGL_DBG2, "DTS: %d bits\n", sl->ts_len);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1264 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1265 if(packet_len * 8 <= n+8)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1266 return -1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1267 if(cts_flag && (sl->ts_len > 0))
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1268 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1269 int i = 0, m;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1270
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1271 while(i < sl->ts_len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1272 {
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21421
diff changeset
1273 m = FFMIN(8, sl->ts_len - i);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1274 v |= getbits(buf, n, m);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1275 if(sl->ts_len - i > 8)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1276 v <<= 8;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1277 i += m;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1278 n += m;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1279 if(packet_len * 8 <= n+8)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1280 return -1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1281 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1282
30256
c116c83f6268 Use double instead of float for pts.
cehoyos
parents: 30088
diff changeset
1283 pes_es->pts = (double) v / (double) sl->ts_resolution;
16750
0a31740dd5e6 Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents: 16292
diff changeset
1284 mp_msg(MSGT_DEMUXER,MSGL_DBG2, "CTS: %d bits, value: %"PRIu64"/%d = %.3f\n", sl->ts_len, v, sl->ts_resolution, pes_es->pts);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1285 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1286
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1287
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1288 i = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1289 pl_size = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1290 while(i < sl->au_len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1291 {
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21421
diff changeset
1292 m = FFMIN(8, sl->au_len - i);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1293 pl_size |= getbits(buf, n, m);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1294 if(sl->au_len - i > 8)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1295 pl_size <<= 8;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1296 i += m;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1297 n += m;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1298 if(packet_len * 8 <= n+8)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1299 return -1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1300 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1301 mp_msg(MSGT_DEMUXER,MSGL_DBG2, "AU_LEN: %u (%d bits)\n", pl_size, sl->au_len);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1302 if(ib_flag)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1303 n += sl->instant_bitrate_len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1304 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1305
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1306 m = (n+7)/8;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1307 if(0 < pl_size && pl_size < pes_es->payload_size)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1308 pes_es->payload_size = pl_size;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1309
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1310 mp_msg(MSGT_DEMUXER,MSGL_V, "mp4_parse_sl_packet, n=%d, m=%d, size from pes hdr: %u, sl hdr size: %u, RAP FLAGS: %d/%d\n",
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1311 n, m, pes_es->payload_size, pl_size, (int) rap_flag, (int) sl->random_accesspoint_only);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1312
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1313 return m;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1314 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1315
28210
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1316 //this function parses the extension fields in the PES header and returns the substream_id, or -1 in case of errors
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1317 static int parse_pes_extension_fields(unsigned char *p, int pkt_len)
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1318 {
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1319 int skip;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1320 unsigned char flags;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1321
28210
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1322 if(!(p[7] & 0x1)) //no extension_field
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1323 return -1;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1324 skip = 9;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1325 if(p[7] & 0x80)
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1326 {
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1327 skip += 5;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1328 if(p[7] & 0x40)
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1329 skip += 5;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1330 }
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1331 if(p[7] & 0x20) //escr_flag
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1332 skip += 6;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1333 if(p[7] & 0x10) //es_rate_flag
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1334 skip += 3;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1335 if(p[7] & 0x08)//dsm_trick_mode is unsupported, skip
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1336 {
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1337 skip = 0;//don't let's parse the extension fields
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1338 }
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1339 if(p[7] & 0x04) //additional_copy_info
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1340 skip += 1;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1341 if(p[7] & 0x02) //pes_crc_flag
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1342 skip += 2;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1343 if(skip >= pkt_len) //too few bytes
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1344 return -1;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1345 flags = p[skip];
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1346 skip++;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1347 if(flags & 0x80) //pes_private_data_flag
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1348 skip += 16;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1349 if(skip >= pkt_len)
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1350 return -1;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1351 if(flags & 0x40) //pack_header_field_flag
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1352 {
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1353 unsigned char l = p[skip];
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1354 skip += l;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1355 }
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1356 if(flags & 0x20) //program_packet_sequence_counter
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1357 skip += 2;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1358 if(flags & 0x10) //p_std
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1359 skip += 2;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1360 if(skip >= pkt_len)
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1361 return -1;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1362 if(flags & 0x01) //finally the long desired pes_extension2
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1363 {
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1364 unsigned char l = p[skip]; //ext2 flag+len
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1365 skip++;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1366 if((l == 0x81) && (skip < pkt_len))
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1367 {
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1368 int ssid = p[skip];
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1369 mp_msg(MSGT_IDENTIFY, MSGL_V, "SUBSTREAM_ID=%d (0x%02X)\n", ssid, ssid);
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1370 return ssid;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1371 }
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1372 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1373
28210
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1374 return -1;
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1375 }
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1376
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1377 static int pes_parse2(unsigned char *buf, uint16_t packet_len, ES_stream_t *es, int32_t type_from_pmt, pmt_t *pmt, int pid)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1378 {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1379 unsigned char *p;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1380 uint32_t header_len;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1381 int64_t pts;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1382 uint32_t stream_id;
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1383 uint32_t pkt_len, pes_is_aligned;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1384
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1385 //Here we are always at the start of a PES packet
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1386 mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2(%p, %d): \n", buf, (uint32_t) packet_len);
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1387
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1388 if(packet_len == 0 || packet_len > 184)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1389 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1390 mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2, BUFFER LEN IS TOO SMALL OR TOO BIG: %d EXIT\n", packet_len);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1391 return 0;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1392 }
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1393
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1394 p = buf;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1395 pkt_len = packet_len;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1396
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1397
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
1398 mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: HEADER %02x %02x %02x %02x\n", p[0], p[1], p[2], p[3]);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1399 if (p[0] || p[1] || (p[2] != 1))
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1400 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1401 mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: error HEADER %02x %02x %02x (should be 0x000001) \n", p[0], p[1], p[2]);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1402 return 0 ;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1403 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1404
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1405 packet_len -= 6;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1406 if(packet_len==0)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1407 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1408 mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: packet too short: %d, exit\n", packet_len);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1409 return 0;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1410 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1411
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1412 es->payload_size = (p[4] << 8 | p[5]);
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1413 pes_is_aligned = (p[6] & 4);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1414
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1415 stream_id = p[3];
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1416
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1417
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1418 if (p[7] & 0x80)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1419 { /* pts available */
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1420 pts = (int64_t)(p[9] & 0x0E) << 29 ;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1421 pts |= p[10] << 22 ;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1422 pts |= (p[11] & 0xFE) << 14 ;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1423 pts |= p[12] << 7 ;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1424 pts |= (p[13] & 0xFE) >> 1 ;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1425
30257
77265abe0200 Use double-precision constants instead of single precision that gets cast to double.
reimar
parents: 30256
diff changeset
1426 es->pts = pts / 90000.0;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1427 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1428 else
30257
77265abe0200 Use double-precision constants instead of single precision that gets cast to double.
reimar
parents: 30256
diff changeset
1429 es->pts = 0.0;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1430
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1431
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1432 header_len = p[8];
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1433
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1434
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1435 if (header_len + 9 > pkt_len) //9 are the bytes read up to the header_length field
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1436 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1437 mp_msg(MSGT_DEMUX, MSGL_DBG2, "demux_ts: illegal value for PES_header_data_length (0x%02x)\n", header_len);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1438 return 0;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1439 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1440
28210
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1441 if(stream_id==0xfd)
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1442 {
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1443 int ssid = parse_pes_extension_fields(p, pkt_len);
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1444 if((audio_substream_id!=-1) && (ssid != audio_substream_id))
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1445 return 0;
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
1446 if(ssid == 0x72 && type_from_pmt != AUDIO_DTS && type_from_pmt != SPU_PGS)
29415
ed4191b00420 handle TrueHD streams (they are carried in 0xFD PES streams in substream 0x72)
nicodvb
parents: 29339
diff changeset
1447 es->type = type_from_pmt = AUDIO_TRUEHD;
28210
6fc5386a8b6b added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
nicodvb
parents: 28051
diff changeset
1448 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1449
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1450 p += header_len + 9;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1451 packet_len -= header_len + 3;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1452
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1453 if(es->payload_size)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1454 es->payload_size -= header_len + 3;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1455
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1456
20462
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
1457 es->is_synced = 1; //only for SL streams we have to make sure it's really true, see below
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1458 if (stream_id == 0xbd)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1459 {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1460 mp_msg(MSGT_DEMUX, MSGL_DBG3, "pes_parse2: audio buf = %02X %02X %02X %02X %02X %02X %02X %02X, 80: %d\n",
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1461 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[0] & 0x80);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1462
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1463
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1464 /*
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1465 * we check the descriptor tag first because some stations
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1466 * do not include any of the A52 header info in their audio tracks
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1467 * these "raw" streams may begin with a byte that looks like a stream type.
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1468 */
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1469
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1470
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
1471 if(type_from_pmt == SPU_PGS)
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
1472 {
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
1473 es->start = p;
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
1474 es->size = packet_len;
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
1475 es->type = SPU_PGS;
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
1476 es->payload_size -= packet_len;
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
1477 return 1;
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
1478 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1479 if(
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1480 (type_from_pmt == AUDIO_A52) || /* A52 - raw */
31605
21ac1f3cfb7f Add packet->len checks to avoid out-of-bounds reads and negative
reimar
parents: 31603
diff changeset
1481 (packet_len >= 2 && p[0] == 0x0B && p[1] == 0x77) /* A52 - syncword */
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1482 )
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1483 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1484 mp_msg(MSGT_DEMUX, MSGL_DBG2, "A52 RAW OR SYNCWORD\n");
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1485 es->start = p;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1486 es->size = packet_len;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1487 es->type = AUDIO_A52;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1488 es->payload_size -= packet_len;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1489
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1490 return 1;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1491 }
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1492 /* SPU SUBS */
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1493 else if(type_from_pmt == SPU_DVB ||
32779
87504a38a666 Change SVB SPU stream format in TS demuxer so it can be decoded by
reimar
parents: 32777
diff changeset
1494 (packet_len >= 2 && (p[0] == 0x20) && pes_is_aligned)) // && p[1] == 0x00))
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1495 {
32779
87504a38a666 Change SVB SPU stream format in TS demuxer so it can be decoded by
reimar
parents: 32777
diff changeset
1496 // offset/length fiddling to make decoding with lavc possible
87504a38a666 Change SVB SPU stream format in TS demuxer so it can be decoded by
reimar
parents: 32777
diff changeset
1497 es->start = p + 2;
87504a38a666 Change SVB SPU stream format in TS demuxer so it can be decoded by
reimar
parents: 32777
diff changeset
1498 es->size = packet_len - 2;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1499 es->type = SPU_DVB;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1500 es->payload_size -= packet_len;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1501
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1502 return 1;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1503 }
31605
21ac1f3cfb7f Add packet->len checks to avoid out-of-bounds reads and negative
reimar
parents: 31603
diff changeset
1504 else if (pes_is_aligned && packet_len >= 1 && ((p[0] & 0xE0) == 0x20)) //SPU_DVD
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1505 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1506 //DVD SUBS
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1507 es->start = p+1;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1508 es->size = packet_len-1;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1509 es->type = SPU_DVD;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1510 es->payload_size -= packet_len;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1511
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1512 return 1;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1513 }
31605
21ac1f3cfb7f Add packet->len checks to avoid out-of-bounds reads and negative
reimar
parents: 31603
diff changeset
1514 else if (pes_is_aligned && packet_len >= 4 && (p[0] & 0xF8) == 0x80)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1515 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1516 mp_msg(MSGT_DEMUX, MSGL_DBG2, "A52 WITH HEADER\n");
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1517 es->start = p+4;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1518 es->size = packet_len - 4;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1519 es->type = AUDIO_A52;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1520 es->payload_size -= packet_len;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1521
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1522 return 1;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1523 }
31605
21ac1f3cfb7f Add packet->len checks to avoid out-of-bounds reads and negative
reimar
parents: 31603
diff changeset
1524 else if (pes_is_aligned && packet_len >= 1 && ((p[0]&0xf0) == 0xa0))
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1525 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1526 int pcm_offset;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1527
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1528 for (pcm_offset=0; ++pcm_offset < packet_len-1 ; )
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1529 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1530 if (p[pcm_offset] == 0x01 && p[pcm_offset+1] == 0x80)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1531 { /* START */
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1532 pcm_offset += 2;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1533 break;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1534 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1535 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1536
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1537 es->start = p + pcm_offset;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1538 es->size = packet_len - pcm_offset;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1539 es->type = AUDIO_LPCM_BE;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1540 es->payload_size -= packet_len;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1541
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1542 return 1;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1543 }
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1544 else
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1545 {
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1546 mp_msg(MSGT_DEMUX, MSGL_DBG2, "PES_PRIVATE1\n");
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1547 es->start = p;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1548 es->size = packet_len;
18564
c56569da9230 fixed wrong assignment of stream type in generic PES_PRIVATE1 streams (didn't respect the type qualified in the PMT)
nicodvb
parents: 18563
diff changeset
1549 es->type = (type_from_pmt == UNKNOWN ? PES_PRIVATE1 : type_from_pmt);
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1550 es->payload_size -= packet_len;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1551
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1552 return 1;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
1553 }
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1554 }
22162
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
1555 else if(((stream_id >= 0xe0) && (stream_id <= 0xef)) || (stream_id == 0xfd && type_from_pmt != UNKNOWN))
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1556 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1557 es->start = p;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1558 es->size = packet_len;
12049
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
1559 if(type_from_pmt != UNKNOWN)
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
1560 es->type = type_from_pmt;
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
1561 else
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
1562 es->type = VIDEO_MPEG2;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1563 if(es->payload_size)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1564 es->payload_size -= packet_len;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1565
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1566 mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: M2V size %d\n", es->size);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1567 return 1;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1568 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1569 else if ((stream_id == 0xfa))
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1570 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1571 int l;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1572
20462
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
1573 es->is_synced = 0;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1574 if(type_from_pmt != UNKNOWN) //MP4 A/V or SL
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1575 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1576 es->start = p;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1577 es->size = packet_len;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1578 es->type = type_from_pmt;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1579
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1580 if(type_from_pmt == SL_PES_STREAM)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1581 {
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1582 //if(pes_is_aligned)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1583 //{
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1584 l = mp4_parse_sl_packet(pmt, p, packet_len, pid, es);
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1585 mp_msg(MSGT_DEMUX, MSGL_DBG2, "L=%d, TYPE=%x\n", l, type_from_pmt);
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1586 if(l < 0)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1587 {
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1588 mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: couldn't parse SL header, passing along full PES payload\n");
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1589 l = 0;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1590 }
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1591 //}
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1592
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1593 es->start += l;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1594 es->size -= l;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1595 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1596
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1597 if(es->payload_size)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1598 es->payload_size -= packet_len;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1599 return 1;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1600 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1601 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1602 else if ((stream_id & 0xe0) == 0xc0)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1603 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1604 es->start = p;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1605 es->size = packet_len;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1606
19537
45e1650f9ad5 don't try to autodetect aac in pes packets (the detection is prone to give wrong results); use the stream_type from the PMT instead
nicodvb
parents: 18714
diff changeset
1607 if(type_from_pmt != UNKNOWN)
45e1650f9ad5 don't try to autodetect aac in pes packets (the detection is prone to give wrong results); use the stream_type from the PMT instead
nicodvb
parents: 18714
diff changeset
1608 es->type = type_from_pmt;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1609 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1610 es->type = AUDIO_MP2;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1611
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1612 es->payload_size -= packet_len;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1613
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1614 return 1;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1615 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1616 else if (type_from_pmt != -1) //as a last resort here we trust the PMT, if present
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1617 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1618 es->start = p;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1619 es->size = packet_len;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1620 es->type = type_from_pmt;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1621 es->payload_size -= packet_len;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1622
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1623 return 1;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1624 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1625 else
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1626 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1627 mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: unknown packet, id: %x\n", stream_id);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1628 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1629
20462
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
1630 es->is_synced = 0;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1631 return 0;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1632 }
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1633
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1634
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1635
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1636
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1637 static int ts_sync(stream_t *stream)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1638 {
22050
1bd2bb5369ce reduced verbosity
nicodvb
parents: 22049
diff changeset
1639 mp_msg(MSGT_DEMUX, MSGL_DBG3, "TS_SYNC \n");
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
1640
31844
22f2eb79536f Simplify ts_sync. Might also make it easier to optimize a bit.
reimar
parents: 31843
diff changeset
1641 while (!stream->eof)
22f2eb79536f Simplify ts_sync. Might also make it easier to optimize a bit.
reimar
parents: 31843
diff changeset
1642 if (stream_read_char(stream) == 0x47)
22f2eb79536f Simplify ts_sync. Might also make it easier to optimize a bit.
reimar
parents: 31843
diff changeset
1643 return 1;
22f2eb79536f Simplify ts_sync. Might also make it easier to optimize a bit.
reimar
parents: 31843
diff changeset
1644
22f2eb79536f Simplify ts_sync. Might also make it easier to optimize a bit.
reimar
parents: 31843
diff changeset
1645 return 0;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1646 }
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1647
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1648
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1649 static void ts_dump_streams(ts_priv_t *priv)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1650 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1651 int i;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1652
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1653 for(i = 0; i < 3; i++)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1654 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1655 if((priv->fifo[i].pack != NULL) && (priv->fifo[i].offset != 0))
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1656 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1657 resize_demux_packet(priv->fifo[i].pack, priv->fifo[i].offset);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1658 ds_add_packet(priv->fifo[i].ds, priv->fifo[i].pack);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1659 priv->fifo[i].offset = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1660 priv->fifo[i].pack = NULL;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1661 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1662 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1663 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1664
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1665
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
1666 static int32_t prog_idx_in_pat(ts_priv_t *priv, uint16_t progid)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1667 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1668 int x;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1669
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1670 if(priv->pat.progs == NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1671 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1672
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1673 for(x = 0; x < priv->pat.progs_cnt; x++)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1674 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1675 if(priv->pat.progs[x].id == progid)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1676 return x;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1677 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1678
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1679 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1680 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1681
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1682
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
1683 static int32_t prog_id_in_pat(ts_priv_t *priv, uint16_t pid)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1684 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1685 int x;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1687 if(priv->pat.progs == NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1688 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1689
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1690 for(x = 0; x < priv->pat.progs_cnt; x++)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1691 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1692 if(priv->pat.progs[x].pmt_pid == pid)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1693 return priv->pat.progs[x].id;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1694 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1695
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1696 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1697 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1698
16934
0c5f661011f0 fixed possible uint8 overflow; assign progid to the newly created pmt
nicodvb
parents: 16883
diff changeset
1699 static int collect_section(ts_section_t *section, int is_start, unsigned char *buff, int size)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1700 {
16934
0c5f661011f0 fixed possible uint8 overflow; assign progid to the newly created pmt
nicodvb
parents: 16883
diff changeset
1701 uint8_t *ptr;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1702 uint16_t tlen;
16934
0c5f661011f0 fixed possible uint8 overflow; assign progid to the newly created pmt
nicodvb
parents: 16883
diff changeset
1703 int skip, tid;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1704
16934
0c5f661011f0 fixed possible uint8 overflow; assign progid to the newly created pmt
nicodvb
parents: 16883
diff changeset
1705 mp_msg(MSGT_DEMUX, MSGL_V, "COLLECT_SECTION, start: %d, size: %d, collected: %d\n", is_start, size, section->buffer_len);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1706 if(! is_start && !section->buffer_len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1707 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1708
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1709 if(is_start)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1710 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1711 if(! section->buffer)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1712 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30579
diff changeset
1713 section->buffer = malloc(4096 + 256);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1714 if(section->buffer == NULL)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1715 return 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1716 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1717 section->buffer_len = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1718 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1719
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1720 if(size + section->buffer_len > 4096+256)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1721 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1722 mp_msg(MSGT_DEMUX, MSGL_V, "COLLECT_SECTION, excessive len: %d + %d\n", section->buffer_len, size);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1723 return 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1724 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1725
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1726 memcpy(&(section->buffer[section->buffer_len]), buff, size);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1727 section->buffer_len += size;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1728
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1729 if(section->buffer_len < 3)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1730 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1731
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1732 skip = section->buffer[0];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1733 if(skip + 4 > section->buffer_len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1734 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1735
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1736 ptr = &(section->buffer[skip + 1]);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1737 tid = ptr[0];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1738 tlen = ((ptr[1] & 0x0f) << 8) | ptr[2];
16934
0c5f661011f0 fixed possible uint8 overflow; assign progid to the newly created pmt
nicodvb
parents: 16883
diff changeset
1739 mp_msg(MSGT_DEMUX, MSGL_V, "SKIP: %d+1, TID: %d, TLEN: %d, COLLECTED: %d\n", skip, tid, tlen, section->buffer_len);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1740 if(section->buffer_len < (skip+1+3+tlen))
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1741 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1742 mp_msg(MSGT_DEMUX, MSGL_DBG2, "DATA IS NOT ENOUGH, NEXT TIME\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1743 return 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1744 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1745
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1746 return skip+1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1747 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1748
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1749 static int parse_pat(ts_priv_t * priv, int is_start, unsigned char *buff, int size)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1750 {
16934
0c5f661011f0 fixed possible uint8 overflow; assign progid to the newly created pmt
nicodvb
parents: 16883
diff changeset
1751 int skip;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1752 unsigned char *ptr;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1753 unsigned char *base;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1754 int entries, i;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1755 uint16_t progid;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1756 ts_section_t *section;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1757
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1758 section = &(priv->pat.section);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1759 skip = collect_section(section, is_start, buff, size);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1760 if(! skip)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1761 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1762
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1763 ptr = &(section->buffer[skip]);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1764 //PARSING
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1765 priv->pat.table_id = ptr[0];
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1766 if(priv->pat.table_id != 0)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1767 return 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1768 priv->pat.ssi = (ptr[1] >> 7) & 0x1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1769 priv->pat.curr_next = ptr[5] & 0x01;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1770 priv->pat.ts_id = (ptr[3] << 8 ) | ptr[4];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1771 priv->pat.version_number = (ptr[5] >> 1) & 0x1F;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1772 priv->pat.section_length = ((ptr[1] & 0x03) << 8 ) | ptr[2];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1773 priv->pat.section_number = ptr[6];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1774 priv->pat.last_section_number = ptr[7];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1775
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1776 //check_crc32(0xFFFFFFFFL, ptr, priv->pat.buffer_len - 4, &ptr[priv->pat.buffer_len - 4]);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1777 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_PAT: section_len: %d, section %d/%d\n", priv->pat.section_length, priv->pat.section_number, priv->pat.last_section_number);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1778
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1779 entries = (int) (priv->pat.section_length - 9) / 4; //entries per section
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1780
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1781 for(i=0; i < entries; i++)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1782 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1783 int32_t idx;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1784 base = &ptr[8 + i*4];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1785 progid = (base[0] << 8) | base[1];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1786
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1787 if((idx = prog_idx_in_pat(priv, progid)) == -1)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1788 {
35224
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
1789 priv->pat.progs = realloc_struct(priv->pat.progs, priv->pat.progs_cnt+1, sizeof(struct pat_progs_t));
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
1790 if(!priv->pat.progs)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1791 {
35224
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
1792 int sz = sizeof(struct pat_progs_t) * (priv->pat.progs_cnt+1);
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
1793 priv->pat.progs_cnt = 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1794 mp_msg(MSGT_DEMUX, MSGL_ERR, "PARSE_PAT: COULDN'T REALLOC %d bytes, NEXT\n", sz);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1795 break;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1796 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1797 idx = priv->pat.progs_cnt;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1798 priv->pat.progs_cnt++;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1799 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1800
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1801 priv->pat.progs[idx].id = progid;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1802 priv->pat.progs[idx].pmt_pid = ((base[2] & 0x1F) << 8) | base[3];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1803 mp_msg(MSGT_DEMUX, MSGL_V, "PROG: %d (%d-th of %d), PMT: %d\n", priv->pat.progs[idx].id, i+1, entries, priv->pat.progs[idx].pmt_pid);
28770
7b90cac39182 Fix mp_msg call with too few arguments.
reimar
parents: 28576
diff changeset
1804 mp_msg(MSGT_IDENTIFY, MSGL_V, "PROGRAM_ID=%d (0x%02X), PMT_PID: %d(0x%02X)\n",
7b90cac39182 Fix mp_msg call with too few arguments.
reimar
parents: 28576
diff changeset
1805 progid, progid, priv->pat.progs[idx].pmt_pid, priv->pat.progs[idx].pmt_pid);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1806 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1807
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1808 return 1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1809 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1810
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1811
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
1812 static int32_t es_pid_in_pmt(pmt_t * pmt, uint16_t pid)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1813 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1814 uint16_t i;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1815
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1816 if(pmt == NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1817 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1818
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1819 if(pmt->es == NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1820 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1821
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1822 for(i = 0; i < pmt->es_cnt; i++)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1823 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1824 if(pmt->es[i].pid == pid)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
1825 return (int32_t) i;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1826 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1827
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1828 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
1829 }
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1830
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
1831
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1832 static uint16_t get_mp4_desc_len(uint8_t *buf, int *len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1833 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1834 //uint16_t i = 0, size = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1835 int i = 0, j, size = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1836
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1837 mp_msg(MSGT_DEMUX, MSGL_DBG2, "PARSE_MP4_DESC_LEN(%d), bytes: ", *len);
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21421
diff changeset
1838 j = FFMIN(*len, 4);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1839 while(i < j)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1840 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1841 mp_msg(MSGT_DEMUX, MSGL_DBG2, " %x ", buf[i]);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1842 size |= (buf[i] & 0x7f);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1843 if(!(buf[i] & 0x80))
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1844 break;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1845 size <<= 7;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1846 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1847 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1848 mp_msg(MSGT_DEMUX, MSGL_DBG2, ", SIZE=%d\n", size);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1849
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1850 *len = i+1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1851 return size;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1852 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1853
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1854
24570
2ab48a4978d4 removed unused function parameters
nicodvb
parents: 24569
diff changeset
1855 static uint16_t parse_mp4_slconfig_descriptor(uint8_t *buf, int len, void *elem)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1856 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1857 int i = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1858 mp4_es_descr_t *es;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1859 mp4_sl_config_t *sl;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1860
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1861 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_MP4_SLCONFIG_DESCRIPTOR(%d)\n", len);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1862 es = (mp4_es_descr_t *) elem;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1863 if(!es)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1864 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1865 mp_msg(MSGT_DEMUX, MSGL_V, "argh! NULL elem passed, skip\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1866 return len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1867 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1868 sl = &(es->sl);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1869
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1870 sl->ts_len = sl->ocr_len = sl->au_len = sl->instant_bitrate_len = sl->degr_len = sl->au_seqnum_len = sl->packet_seqnum_len = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1871 sl->ocr = sl->dts = sl->cts = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1872
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1873 if(buf[0] == 0)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1874 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1875 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1876 sl->flags = buf[i];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1877 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1878 sl->ts_resolution = (buf[i] << 24) | (buf[i+1] << 16) | (buf[i+2] << 8) | buf[i+3];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1879 i += 4;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1880 sl->ocr_resolution = (buf[i] << 24) | (buf[i+1] << 16) | (buf[i+2] << 8) | buf[i+3];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1881 i += 4;
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1882 sl->ts_len = buf[i];
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1883 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1884 sl->ocr_len = buf[i];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1885 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1886 sl->au_len = buf[i];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1887 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1888 sl->instant_bitrate_len = buf[i];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1889 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1890 sl->degr_len = (buf[i] >> 4) & 0x0f;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1891 sl->au_seqnum_len = ((buf[i] & 0x0f) << 1) | ((buf[i+1] >> 7) & 0x01);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1892 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1893 sl->packet_seqnum_len = ((buf[i] >> 2) & 0x1f);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1894 i++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1895
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1896 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1897 else if(buf[0] == 1)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1898 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1899 sl->flags = 0;
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1900 sl->ts_resolution = 1000;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1901 sl->ts_len = 32;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1902 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1903 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1904 else if(buf[0] == 2)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1905 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1906 sl->flags = 4;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1907 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1908 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1909 else
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1910 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1911 sl->flags = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1912 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1913 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1914
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1915 sl->au_start = (sl->flags >> 7) & 0x1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1916 sl->au_end = (sl->flags >> 6) & 0x1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1917 sl->random_accesspoint = (sl->flags >> 5) & 0x1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1918 sl->random_accesspoint_only = (sl->flags >> 4) & 0x1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1919 sl->padding = (sl->flags >> 3) & 0x1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1920 sl->use_ts = (sl->flags >> 2) & 0x1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1921 sl->idle = (sl->flags >> 1) & 0x1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1922 sl->duration = sl->flags & 0x1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1923
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1924 if(sl->duration)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1925 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1926 sl->timescale = (buf[i] << 24) | (buf[i+1] << 16) | (buf[i+2] << 8) | buf[i+3];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1927 i += 4;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1928 sl->au_duration = (buf[i] << 8) | buf[i+1];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1929 i += 2;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1930 sl->cts_duration = (buf[i] << 8) | buf[i+1];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1931 i += 2;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1932 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1933 else //no support for fixed durations atm
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1934 sl->timescale = sl->au_duration = sl->cts_duration = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1935
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1936 mp_msg(MSGT_DEMUX, MSGL_V, "MP4SLCONFIG(len=0x%x), predef: %d, flags: %x, use_ts: %d, tslen: %d, timescale: %d, dts: %"PRIu64", cts: %"PRIu64"\n",
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1937 len, buf[0], sl->flags, sl->use_ts, sl->ts_len, sl->timescale, (uint64_t) sl->dts, (uint64_t) sl->cts);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1938
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1939 return len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1940 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1941
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1942 static int parse_mp4_descriptors(pmt_t *pmt, uint8_t *buf, int len, void *elem);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1943
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1944 static uint16_t parse_mp4_decoder_config_descriptor(pmt_t *pmt, uint8_t *buf, int len, void *elem)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1945 {
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1946 int i = 0, j;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1947 mp4_es_descr_t *es;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1948 mp4_decoder_config_t *dec;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1949
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1950 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_MP4_DECODER_CONFIG_DESCRIPTOR(%d)\n", len);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1951 es = (mp4_es_descr_t *) elem;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1952 if(!es)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1953 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1954 mp_msg(MSGT_DEMUX, MSGL_V, "argh! NULL elem passed, skip\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1955 return len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1956 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1957 dec = (mp4_decoder_config_t*) &(es->decoder);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1958
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1959 dec->object_type = buf[i];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1960 dec->stream_type = (buf[i+1]>>2) & 0x3f;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1961
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1962 if(dec->object_type == 1 && dec->stream_type == 1)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1963 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1964 dec->object_type = MP4_OD;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1965 dec->stream_type = MP4_OD;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1966 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1967 else if(dec->stream_type == 4)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1968 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1969 if(dec->object_type == 0x6a)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1970 dec->object_type = VIDEO_MPEG1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1971 if(dec->object_type >= 0x60 && dec->object_type <= 0x65)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1972 dec->object_type = VIDEO_MPEG2;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1973 else if(dec->object_type == 0x20)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1974 dec->object_type = VIDEO_MPEG4;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1975 else if(dec->object_type == 0x21)
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1976 dec->object_type = VIDEO_AVC;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1977 /*else if(dec->object_type == 0x22)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
1978 fprintf(stderr, "TYPE 0x22\n");*/
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1979 else dec->object_type = UNKNOWN;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1980 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1981 else if(dec->stream_type == 5)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1982 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1983 if(dec->object_type == 0x40)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1984 dec->object_type = AUDIO_AAC;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1985 else if(dec->object_type == 0x6b)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1986 dec->object_type = AUDIO_MP2;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1987 else if(dec->object_type >= 0x66 && dec->object_type <= 0x69)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1988 dec->object_type = AUDIO_MP2;
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1989 else
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1990 dec->object_type = UNKNOWN;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1991 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1992 else
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
1993 dec->object_type = dec->stream_type = UNKNOWN;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
1994
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1995 if(dec->object_type != UNKNOWN)
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1996 {
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1997 //update the type of the current stream
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1998 for(j = 0; j < pmt->es_cnt; j++)
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
1999 {
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2000 if(pmt->es[j].mp4_es_id == es->id)
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2001 {
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2002 pmt->es[j].type = SL_PES_STREAM;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2003 }
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2004 }
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2005 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2006
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2007 if(len > 13)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2008 parse_mp4_descriptors(pmt, &buf[13], len-13, dec);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2009
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2010 mp_msg(MSGT_DEMUX, MSGL_V, "MP4DECODER(0x%x), object_type: 0x%x, stream_type: 0x%x\n", len, dec->object_type, dec->stream_type);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2011
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2012 return len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2013 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2014
24570
2ab48a4978d4 removed unused function parameters
nicodvb
parents: 24569
diff changeset
2015 static uint16_t parse_mp4_decoder_specific_descriptor(uint8_t *buf, int len, void *elem)
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2016 {
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2017 int i;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2018 mp4_decoder_config_t *dec;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2019
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2020 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_MP4_DECODER_SPECIFIC_DESCRIPTOR(%d)\n", len);
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2021 dec = (mp4_decoder_config_t *) elem;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2022 if(!dec)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2023 {
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2024 mp_msg(MSGT_DEMUX, MSGL_V, "argh! NULL elem passed, skip\n");
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2025 return len;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2026 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2027
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2028 mp_msg(MSGT_DEMUX, MSGL_DBG2, "MP4 SPECIFIC INFO BYTES: \n");
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2029 for(i=0; i<len; i++)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2030 mp_msg(MSGT_DEMUX, MSGL_DBG2, "%02x ", buf[i]);
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2031 mp_msg(MSGT_DEMUX, MSGL_DBG2, "\n");
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2032
18462
557d188e915a raised max extradata size and refuse to store more than the limit
nicodvb
parents: 18461
diff changeset
2033 if(len > MAX_EXTRADATA_SIZE)
557d188e915a raised max extradata size and refuse to store more than the limit
nicodvb
parents: 18461
diff changeset
2034 {
557d188e915a raised max extradata size and refuse to store more than the limit
nicodvb
parents: 18461
diff changeset
2035 mp_msg(MSGT_DEMUX, MSGL_ERR, "DEMUX_TS, EXTRADATA SUSPICIOUSLY BIG: %d, REFUSED\r\n", len);
557d188e915a raised max extradata size and refuse to store more than the limit
nicodvb
parents: 18461
diff changeset
2036 return len;
557d188e915a raised max extradata size and refuse to store more than the limit
nicodvb
parents: 18461
diff changeset
2037 }
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2038 memcpy(dec->buf, buf, len);
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2039 dec->buf_size = len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2040
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2041 return len;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2042 }
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2043
24570
2ab48a4978d4 removed unused function parameters
nicodvb
parents: 24569
diff changeset
2044 static uint16_t parse_mp4_es_descriptor(pmt_t *pmt, uint8_t *buf, int len)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2045 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2046 int i = 0, j = 0, k, found;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2047 uint8_t flag;
35224
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2048 mp4_es_descr_t es, *target_es = NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2049
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2050 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_MP4ES: len=%d\n", len);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2051 memset(&es, 0, sizeof(mp4_es_descr_t));
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2052 while(i < len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2053 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2054 es.id = (buf[i] << 8) | buf[i+1];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2055 mp_msg(MSGT_DEMUX, MSGL_V, "MP4ES_ID: %d\n", es.id);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2056 i += 2;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2057 flag = buf[i];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2058 i++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2059 if(flag & 0x80)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2060 i += 2;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2061 if(flag & 0x40)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2062 i += buf[i]+1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2063 if(flag & 0x20) //OCR, maybe we need it
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2064 i += 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2065
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2066 j = parse_mp4_descriptors(pmt, &buf[i], len-i, &es);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2067 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_MP4ES, types after parse_mp4_descriptors: 0x%x, 0x%x\n", es.decoder.object_type, es.decoder.stream_type);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2068 if(es.decoder.object_type != UNKNOWN && es.decoder.stream_type != UNKNOWN)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2069 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2070 found = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2071 //search this ES_ID if we already have it
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2072 for(k=0; k < pmt->mp4es_cnt; k++)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2073 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2074 if(pmt->mp4es[k].id == es.id)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2075 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2076 target_es = &(pmt->mp4es[k]);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2077 found = 1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2078 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2079 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2080
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2081 if(! found)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2082 {
35224
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2083 pmt->mp4es = realloc_struct(pmt->mp4es, pmt->mp4es_cnt+1, sizeof(mp4_es_descr_t));
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2084 if(!pmt->mp4es)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2085 {
35224
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2086 pmt->mp4es_cnt = 0;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2087 fprintf(stderr, "CAN'T REALLOC MP4_ES_DESCR\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2088 continue;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2089 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2090 target_es = &(pmt->mp4es[pmt->mp4es_cnt]);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2091 pmt->mp4es_cnt++;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2092 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2093 memcpy(target_es, &es, sizeof(mp4_es_descr_t));
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2094 mp_msg(MSGT_DEMUX, MSGL_V, "MP4ES_CNT: %d, ID=%d\n", pmt->mp4es_cnt, target_es->id);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2095 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2096
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2097 i += j;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2098 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2099
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2100 return len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2101 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2102
15067
21330e95a22d obvious gcc warning fix, approved by Nico
rathann
parents: 15045
diff changeset
2103 static void parse_mp4_object_descriptor(pmt_t *pmt, uint8_t *buf, int len, void *elem)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2104 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2105 int i, j = 0, id;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2106
17816
c3530af0e23c init variable in parse_mp4_object_descriptor before using it; fixes cid 237
nicodvb
parents: 17724
diff changeset
2107 i=0;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2108 id = (buf[0] << 2) | ((buf[1] & 0xc0) >> 6);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2109 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_MP4_OBJECT_DESCRIPTOR: len=%d, OD_ID=%d\n", len, id);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2110 if(buf[1] & 0x20)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2111 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2112 i += buf[2] + 1; //url
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2113 mp_msg(MSGT_DEMUX, MSGL_V, "URL\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2114 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2115 else
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2116 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2117 i = 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2118
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2119 while(i < len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2120 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2121 j = parse_mp4_descriptors(pmt, &(buf[i]), len-i, elem);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2122 mp_msg(MSGT_DEMUX, MSGL_V, "OBJD, NOW i = %d, j=%d, LEN=%d\n", i, j, len);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2123 i += j;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2124 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2125 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2126 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2127
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2128
15067
21330e95a22d obvious gcc warning fix, approved by Nico
rathann
parents: 15045
diff changeset
2129 static void parse_mp4_iod(pmt_t *pmt, uint8_t *buf, int len, void *elem)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2130 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2131 int i, j = 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2132 mp4_od_t *iod = &(pmt->iod);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2133
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2134 iod->id = (buf[0] << 2) | ((buf[1] & 0xc0) >> 6);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2135 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_MP4_IOD: len=%d, IOD_ID=%d\n", len, iod->id);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2136 i = 2;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2137 if(buf[1] & 0x20)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2138 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2139 i += buf[2] + 1; //url
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2140 mp_msg(MSGT_DEMUX, MSGL_V, "URL\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2141 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2142 else
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2143 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2144 i = 7;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2145 while(i < len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2146 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2147 j = parse_mp4_descriptors(pmt, &(buf[i]), len-i, elem);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2148 mp_msg(MSGT_DEMUX, MSGL_V, "IOD, NOW i = %d, j=%d, LEN=%d\n", i, j, len);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2149 i += j;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2150 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2151 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2152 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2153
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2154 static int parse_mp4_descriptors(pmt_t *pmt, uint8_t *buf, int len, void *elem)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2155 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2156 int tag, descr_len, i = 0, j = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2157
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2158 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_MP4_DESCRIPTORS, len=%d\n", len);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2159 if(! len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2160 return len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2161
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2162 while(i < len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2163 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2164 tag = buf[i];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2165 j = len - i -1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2166 descr_len = get_mp4_desc_len(&(buf[i+1]), &j);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2167 mp_msg(MSGT_DEMUX, MSGL_V, "TAG=%d (0x%x), DESCR_len=%d, len=%d, j=%d\n", tag, tag, descr_len, len, j);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2168 if(descr_len > len - j+1)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2169 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2170 mp_msg(MSGT_DEMUX, MSGL_V, "descriptor is too long, exit\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2171 return len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2172 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2173 i += j+1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2174
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2175 switch(tag)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2176 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2177 case 0x1:
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2178 parse_mp4_object_descriptor(pmt, &(buf[i]), descr_len, elem);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2179 break;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2180 case 0x2:
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2181 parse_mp4_iod(pmt, &(buf[i]), descr_len, elem);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2182 break;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2183 case 0x3:
24570
2ab48a4978d4 removed unused function parameters
nicodvb
parents: 24569
diff changeset
2184 parse_mp4_es_descriptor(pmt, &(buf[i]), descr_len);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2185 break;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2186 case 0x4:
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2187 parse_mp4_decoder_config_descriptor(pmt, &buf[i], descr_len, elem);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2188 break;
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2189 case 0x05:
24570
2ab48a4978d4 removed unused function parameters
nicodvb
parents: 24569
diff changeset
2190 parse_mp4_decoder_specific_descriptor(&buf[i], descr_len, elem);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2191 break;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2192 case 0x6:
24570
2ab48a4978d4 removed unused function parameters
nicodvb
parents: 24569
diff changeset
2193 parse_mp4_slconfig_descriptor(&buf[i], descr_len, elem);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2194 break;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2195 default:
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2196 mp_msg(MSGT_DEMUX, MSGL_V, "Unsupported mp4 descriptor 0x%x\n", tag);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2197 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2198 i += descr_len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2199 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2200
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2201 return len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2202 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2203
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2204 static ES_stream_t *new_pid(ts_priv_t *priv, int pid)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2205 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2206 ES_stream_t *tss;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2207
32607
9a8baaf45cf2 Replace malloc+memset with calloc and use sizeof(*variable).
reimar
parents: 32606
diff changeset
2208 tss = calloc(sizeof(*tss), 1);
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2209 if(! tss)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2210 return NULL;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2211 tss->pid = pid;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2212 tss->last_cc = -1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2213 tss->type = UNKNOWN;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2214 tss->subtype = UNKNOWN;
14981
293d3dee2eae SL payloads are pushed to audio and video fifo only when they are flagged with random_accesspoint or access_unit_start
nicodvb
parents: 14968
diff changeset
2215 tss->is_synced = 0;
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2216 tss->extradata = NULL;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2217 tss->extradata_alloc = tss->extradata_len = 0;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2218 priv->ts.pids[pid] = tss;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2219
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2220 return tss;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2221 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2222
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2223
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2224 static int parse_program_descriptors(pmt_t *pmt, uint8_t *buf, uint16_t len)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2225 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2226 uint16_t i = 0, k, olen = len;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2227
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2228 while(len > 0)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2229 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2230 mp_msg(MSGT_DEMUX, MSGL_V, "PROG DESCR, TAG=%x, LEN=%d(%x)\n", buf[i], buf[i+1], buf[i+1]);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2231 if(buf[i+1] > len-2)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2232 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2233 mp_msg(MSGT_DEMUX, MSGL_V, "ERROR, descriptor len is too long, skipping\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2234 return olen;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2235 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2236
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2237 if(buf[i] == 0x1d)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2238 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2239 if(buf[i+3] == 2) //buggy versions of vlc muxer make this non-standard mess (missing iod_scope)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2240 k = 3;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2241 else
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2242 k = 4; //this is standard compliant
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2243 parse_mp4_descriptors(pmt, &buf[i+k], (int) buf[i+1]-(k-2), NULL);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2244 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2245
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2246 len -= 2 + buf[i+1];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2247 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2248
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2249 return olen;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2250 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2251
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2252 static int parse_descriptors(struct pmt_es_t *es, uint8_t *ptr)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2253 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2254 int j, descr_len, len;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2255
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2256 j = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2257 len = es->descr_length;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2258 while(len > 2)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2259 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2260 descr_len = ptr[j+1];
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2261 mp_msg(MSGT_DEMUX, MSGL_V, "...descr id: 0x%x, len=%d\n", ptr[j], descr_len);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2262 if(descr_len > len)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2263 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2264 mp_msg(MSGT_DEMUX, MSGL_ERR, "INVALID DESCR LEN for tag %02x: %d vs %d max, EXIT LOOP\n", ptr[j], descr_len, len);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2265 return -1;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2266 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2267
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2268
18563
cd115dadae19 one more a52 descriptor (dvb impl., untested)
nicodvb
parents: 18558
diff changeset
2269 if(ptr[j] == 0x6a || ptr[j] == 0x7a) //A52 Descriptor
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2270 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2271 if(es->type == 0x6)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2272 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2273 es->type = AUDIO_A52;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2274 mp_msg(MSGT_DEMUX, MSGL_DBG2, "DVB A52 Descriptor\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2275 }
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2276 }
24676
c03afe4ed741 support for DTS as specified in DVB (untested)
nicodvb
parents: 24570
diff changeset
2277 else if(ptr[j] == 0x7b) //DVB DTS Descriptor
c03afe4ed741 support for DTS as specified in DVB (untested)
nicodvb
parents: 24570
diff changeset
2278 {
c03afe4ed741 support for DTS as specified in DVB (untested)
nicodvb
parents: 24570
diff changeset
2279 if(es->type == 0x6)
c03afe4ed741 support for DTS as specified in DVB (untested)
nicodvb
parents: 24570
diff changeset
2280 {
c03afe4ed741 support for DTS as specified in DVB (untested)
nicodvb
parents: 24570
diff changeset
2281 es->type = AUDIO_DTS;
c03afe4ed741 support for DTS as specified in DVB (untested)
nicodvb
parents: 24570
diff changeset
2282 mp_msg(MSGT_DEMUX, MSGL_DBG2, "DVB DTS Descriptor\n");
c03afe4ed741 support for DTS as specified in DVB (untested)
nicodvb
parents: 24570
diff changeset
2283 }
c03afe4ed741 support for DTS as specified in DVB (untested)
nicodvb
parents: 24570
diff changeset
2284 }
29502
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
2285 else if(ptr[j] == 0x56) // Teletext
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
2286 {
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
2287 if(descr_len >= 5) {
35104
053d1129e569 Fix reading language from teletext descriptor when it is not
reimar
parents: 35103
diff changeset
2288 memcpy(es->lang, ptr+j+2, 3);
29502
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
2289 es->lang[3] = 0;
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
2290 }
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
2291 es->type = SPU_TELETEXT;
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
2292 }
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2293 else if(ptr[j] == 0x59) //Subtitling Descriptor
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2294 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2295 uint8_t subtype;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2296
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2297 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Subtitling Descriptor\n");
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2298 if(descr_len < 8)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2299 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2300 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Descriptor length too short for DVB Subtitle Descriptor: %d, SKIPPING\n", descr_len);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2301 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2302 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2303 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2304 memcpy(es->lang, &ptr[j+2], 3);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2305 es->lang[3] = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2306 subtype = ptr[j+5];
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2307 if(
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2308 (subtype >= 0x10 && subtype <= 0x13) ||
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2309 (subtype >= 0x20 && subtype <= 0x23)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2310 )
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2311 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2312 es->type = SPU_DVB;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2313 //page parameters: compo page 2 bytes, ancillary page 2 bytes
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2314 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2315 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2316 es->type = UNKNOWN;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2317 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2318 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2319 else if(ptr[j] == 0x50) //Component Descriptor
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2320 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2321 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Component Descriptor\n");
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2322 memcpy(es->lang, &ptr[j+5], 3);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2323 es->lang[3] = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2324 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2325 else if(ptr[j] == 0xa) //Language Descriptor
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2326 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2327 memcpy(es->lang, &ptr[j+2], 3);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2328 es->lang[3] = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2329 mp_msg(MSGT_DEMUX, MSGL_V, "Language Descriptor: %s\n", es->lang);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2330 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2331 else if(ptr[j] == 0x5) //Registration Descriptor (looks like e fourCC :) )
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2332 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2333 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Registration Descriptor\n");
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2334 if(descr_len < 4)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2335 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2336 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Registration Descriptor length too short: %d, SKIPPING\n", descr_len);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2337 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2338 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2339 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2340 char *d;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2341 memcpy(es->format_descriptor, &ptr[j+2], 4);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2342 es->format_descriptor[4] = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2343
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2344 d = &ptr[j+2];
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2345 if(d[0] == 'A' && d[1] == 'C' && d[2] == '-' && d[3] == '3')
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2346 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2347 es->type = AUDIO_A52;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2348 }
23507
173ce7608d49 added support for DTS1 audio descriptor
nicodvb
parents: 23506
diff changeset
2349 else if(d[0] == 'D' && d[1] == 'T' && d[2] == 'S' && d[3] == '1')
173ce7608d49 added support for DTS1 audio descriptor
nicodvb
parents: 23506
diff changeset
2350 {
173ce7608d49 added support for DTS1 audio descriptor
nicodvb
parents: 23506
diff changeset
2351 es->type = AUDIO_DTS;
173ce7608d49 added support for DTS1 audio descriptor
nicodvb
parents: 23506
diff changeset
2352 }
18565
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
2353 else if(d[0] == 'D' && d[1] == 'T' && d[2] == 'S' && d[3] == '2')
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
2354 {
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
2355 es->type = AUDIO_DTS;
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
2356 }
22162
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
2357 else if(d[0] == 'V' && d[1] == 'C' && d[2] == '-' && d[3] == '1')
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
2358 {
23506
ad116ce6028c 1000000l, descriptor VC-1 identifies VIDEO_VC1, not AUDIO_DTS
nicodvb
parents: 23427
diff changeset
2359 es->type = VIDEO_VC1;
22162
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
2360 }
31261
cd1dd08a0afc Add partial support for dirac to TS demuxer.
reimar
parents: 31225
diff changeset
2361 else if(d[0] == 'd' && d[1] == 'r' && d[2] == 'a' && d[3] == 'c')
cd1dd08a0afc Add partial support for dirac to TS demuxer.
reimar
parents: 31225
diff changeset
2362 {
cd1dd08a0afc Add partial support for dirac to TS demuxer.
reimar
parents: 31225
diff changeset
2363 es->type = VIDEO_DIRAC;
cd1dd08a0afc Add partial support for dirac to TS demuxer.
reimar
parents: 31225
diff changeset
2364 }
33374
20285793cdef Support S302M in the native ts demuxer.
cehoyos
parents: 33338
diff changeset
2365 else if(d[0] == 'B' && d[1] == 'S' && d[2] == 'S' && d[3] == 'D')
20285793cdef Support S302M in the native ts demuxer.
cehoyos
parents: 33338
diff changeset
2366 {
20285793cdef Support S302M in the native ts demuxer.
cehoyos
parents: 33338
diff changeset
2367 es->type = AUDIO_S302M;
20285793cdef Support S302M in the native ts demuxer.
cehoyos
parents: 33338
diff changeset
2368 }
36379
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
2369 else if(d[0] == 'H' && d[1] == 'E' && d[2] == 'V' && d[3] == 'C')
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
2370 {
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
2371 es->type = VIDEO_HEVC;
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
2372 }
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2373 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2374 es->type = UNKNOWN;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2375 mp_msg(MSGT_DEMUX, MSGL_DBG2, "FORMAT %s\n", es->format_descriptor);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2376 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2377 }
32580
ed5e29af7847 Fix TS files with MP4 ES AAC descriptor to be correctly recognized
reimar
parents: 32548
diff changeset
2378 else if(ptr[j] == 0x1e || ptr[j] == 0x1f)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2379 {
32580
ed5e29af7847 Fix TS files with MP4 ES AAC descriptor to be correctly recognized
reimar
parents: 32548
diff changeset
2380 // 0x1f is FMC, but currently it is easiest to handle them the same way
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2381 es->mp4_es_id = (ptr[j+2] << 8) | ptr[j+3];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2382 mp_msg(MSGT_DEMUX, MSGL_V, "SL Descriptor: ES_ID: %d(%x), pid: %d\n", es->mp4_es_id, es->mp4_es_id, es->pid);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2383 }
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2384 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2385 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Unknown descriptor 0x%x, SKIPPING\n", ptr[j]);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2386
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2387 len -= 2 + descr_len;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2388 j += 2 + descr_len;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2389 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2390
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2391 return 1;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2392 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2393
24570
2ab48a4978d4 removed unused function parameters
nicodvb
parents: 24569
diff changeset
2394 static int parse_sl_section(pmt_t *pmt, ts_section_t *section, int is_start, unsigned char *buff, int size)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2395 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2396 int tid, len, skip;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2397 uint8_t *ptr;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2398 skip = collect_section(section, is_start, buff, size);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2399 if(! skip)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2400 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2401
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2402 ptr = &(section->buffer[skip]);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2403 tid = ptr[0];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2404 len = ((ptr[1] & 0x0f) << 8) | ptr[2];
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2405 mp_msg(MSGT_DEMUX, MSGL_V, "TABLEID: %d (av. %d), skip=%d, LEN: %d\n", tid, section->buffer_len, skip, len);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2406 if(len > 4093 || section->buffer_len < len || tid != 5)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2407 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2408 mp_msg(MSGT_DEMUX, MSGL_V, "SECTION TOO LARGE or wrong section type, EXIT\n");
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2409 return 0;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2410 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2411
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2412 if(! (ptr[5] & 1))
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2413 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2414
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2415 //8 is the current position, len - 9 is the amount of data available
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2416 parse_mp4_descriptors(pmt, &ptr[8], len - 9, NULL);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2417
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2418 return 1;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2419 }
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
2420
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2421 static int parse_pmt(ts_priv_t * priv, uint16_t progid, uint16_t pid, int is_start, unsigned char *buff, int size)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2422 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2423 unsigned char *base, *es_base;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2424 pmt_t *pmt;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2425 int32_t idx, es_count, section_bytes;
16934
0c5f661011f0 fixed possible uint8 overflow; assign progid to the newly created pmt
nicodvb
parents: 16883
diff changeset
2426 uint8_t m=0;
0c5f661011f0 fixed possible uint8 overflow; assign progid to the newly created pmt
nicodvb
parents: 16883
diff changeset
2427 int skip;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2428 ts_section_t *section;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2429 ES_stream_t *tss;
32580
ed5e29af7847 Fix TS files with MP4 ES AAC descriptor to be correctly recognized
reimar
parents: 32548
diff changeset
2430 int i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2431
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2432 idx = progid_idx_in_pmt(priv, progid);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2433
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2434 if(idx == -1)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2435 {
35224
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2436 priv->pmt = realloc_struct(priv->pmt, priv->pmt_cnt + 1, sizeof(pmt_t));
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2437 if(!priv->pmt)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2438 {
35224
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2439 int sz = (priv->pmt_cnt + 1) * sizeof(pmt_t);
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2440 priv->pmt_cnt = 0;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2441 mp_msg(MSGT_DEMUX, MSGL_ERR, "PARSE_PMT: COULDN'T REALLOC %d bytes, NEXT\n", sz);
13187
ec342714b8a9 small fixes
rathann
parents: 12612
diff changeset
2442 return 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2443 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2444 idx = priv->pmt_cnt;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2445 memset(&(priv->pmt[idx]), 0, sizeof(pmt_t));
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2446 priv->pmt_cnt++;
16934
0c5f661011f0 fixed possible uint8 overflow; assign progid to the newly created pmt
nicodvb
parents: 16883
diff changeset
2447 priv->pmt[idx].progid = progid;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2448 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2449
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2450 pmt = &(priv->pmt[idx]);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2451
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2452 section = &(pmt->section);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2453 skip = collect_section(section, is_start, buff, size);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2454 if(! skip)
13187
ec342714b8a9 small fixes
rathann
parents: 12612
diff changeset
2455 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2456
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2457 base = &(section->buffer[skip]);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2458
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2459 mp_msg(MSGT_DEMUX, MSGL_V, "FILL_PMT(prog=%d), PMT_len: %d, IS_START: %d, TS_PID: %d, SIZE=%d, M=%d, ES_CNT=%d, IDX=%d, PMT_PTR=%p\n",
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2460 progid, pmt->section.buffer_len, is_start, pid, size, m, pmt->es_cnt, idx, pmt);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2461
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2462 pmt->table_id = base[0];
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2463 if(pmt->table_id != 2)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2464 return -1;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2465 pmt->ssi = base[1] & 0x80;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2466 pmt->section_length = (((base[1] & 0xf) << 8 ) | base[2]);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2467 pmt->version_number = (base[5] >> 1) & 0x1f;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2468 pmt->curr_next = (base[5] & 1);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2469 pmt->section_number = base[6];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2470 pmt->last_section_number = base[7];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2471 pmt->PCR_PID = ((base[8] & 0x1f) << 8 ) | base[9];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2472 pmt->prog_descr_length = ((base[10] & 0xf) << 8 ) | base[11];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2473 if(pmt->prog_descr_length > pmt->section_length - 9)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2474 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2475 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_PMT, INVALID PROG_DESCR LENGTH (%d vs %d)\n", pmt->prog_descr_length, pmt->section_length - 9);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2476 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2477 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2478
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2479 if(pmt->prog_descr_length)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2480 parse_program_descriptors(pmt, &base[12], pmt->prog_descr_length);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2481
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2482 es_base = &base[12 + pmt->prog_descr_length]; //the beginning of th ES loop
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2483
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2484 section_bytes= pmt->section_length - 13 - pmt->prog_descr_length;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2485 es_count = 0;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2486
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2487 while(section_bytes >= 5)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2488 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2489 int es_pid, es_type;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2490
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2491 es_type = es_base[0];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2492 es_pid = ((es_base[1] & 0x1f) << 8) | es_base[2];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2493
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2494 idx = es_pid_in_pmt(pmt, es_pid);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2495 if(idx == -1)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2496 {
35224
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2497 pmt->es = realloc_struct(pmt->es, pmt->es_cnt + 1, sizeof(struct pmt_es_t));
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2498 if(!pmt->es)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2499 {
35224
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2500 int sz = sizeof(struct pmt_es_t) * (pmt->es_cnt + 1);
b4d9b416a8f1 Remove some incorrect usages of realloc_struct.
reimar
parents: 35104
diff changeset
2501 pmt->es_cnt = 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2502 mp_msg(MSGT_DEMUX, MSGL_ERR, "PARSE_PMT, COULDN'T ALLOCATE %d bytes for PMT_ES\n", sz);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2503 continue;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2504 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2505 idx = pmt->es_cnt;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2506 memset(&(pmt->es[idx]), 0, sizeof(struct pmt_es_t));
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2507 pmt->es_cnt++;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2508 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2509
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2510 pmt->es[idx].descr_length = ((es_base[3] & 0xf) << 8) | es_base[4];
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2511
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2512
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2513 if(pmt->es[idx].descr_length > section_bytes - 5)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2514 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2515 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_PMT, ES_DESCR_LENGTH TOO LARGE %d > %d, EXIT\n",
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2516 pmt->es[idx].descr_length, section_bytes - 5);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2517 return -1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2518 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2519
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2520
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2521 pmt->es[idx].pid = es_pid;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2522 if(es_type != 0x6)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2523 pmt->es[idx].type = UNKNOWN;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2524 else
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2525 pmt->es[idx].type = es_type;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2526
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2527 parse_descriptors(&pmt->es[idx], &es_base[5]);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2528
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2529 switch(es_type)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2530 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2531 case 1:
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2532 pmt->es[idx].type = VIDEO_MPEG1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2533 break;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2534 case 2:
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2535 pmt->es[idx].type = VIDEO_MPEG2;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2536 break;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2537 case 3:
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2538 case 4:
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2539 pmt->es[idx].type = AUDIO_MP2;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2540 break;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2541 case 6:
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2542 if(pmt->es[idx].type == 0x6) //this could have been ovrwritten by parse_descriptors
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2543 pmt->es[idx].type = UNKNOWN;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2544 break;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2545 case 0x10:
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2546 pmt->es[idx].type = VIDEO_MPEG4;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2547 break;
14571
512a57bbe68d replaced bzero() with memset(); stream_type 0x0f is AAC
nicodvb
parents: 14046
diff changeset
2548 case 0x0f:
31454
171320c96f2c Make demux_ts detect LATM AAC as a separate type.
reimar
parents: 31261
diff changeset
2549 pmt->es[idx].type = AUDIO_AAC;
171320c96f2c Make demux_ts detect LATM AAC as a separate type.
reimar
parents: 31261
diff changeset
2550 break;
25837
643064afe2a4 in the PMT stream_type==0x11 indicates AAC in LATM streams, that now libfaad can decode; re-added
nicodvb
parents: 25707
diff changeset
2551 case 0x11:
31454
171320c96f2c Make demux_ts detect LATM AAC as a separate type.
reimar
parents: 31261
diff changeset
2552 pmt->es[idx].type = AUDIO_AAC_LATM;
32580
ed5e29af7847 Fix TS files with MP4 ES AAC descriptor to be correctly recognized
reimar
parents: 32548
diff changeset
2553 for (i = 0; i < pmt->mp4es_cnt; i++)
ed5e29af7847 Fix TS files with MP4 ES AAC descriptor to be correctly recognized
reimar
parents: 32548
diff changeset
2554 if (pmt->mp4es[i].id == pmt->es[idx].mp4_es_id &&
ed5e29af7847 Fix TS files with MP4 ES AAC descriptor to be correctly recognized
reimar
parents: 32548
diff changeset
2555 pmt->mp4es[i].decoder.object_type == AUDIO_AAC)
ed5e29af7847 Fix TS files with MP4 ES AAC descriptor to be correctly recognized
reimar
parents: 32548
diff changeset
2556 pmt->es[idx].type = AUDIO_AAC;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2557 break;
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 13994
diff changeset
2558 case 0x1b:
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 13994
diff changeset
2559 pmt->es[idx].type = VIDEO_H264;
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 13994
diff changeset
2560 break;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2561 case 0x12:
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2562 pmt->es[idx].type = SL_PES_STREAM;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2563 break;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2564 case 0x13:
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2565 pmt->es[idx].type = SL_SECTION;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2566 break;
35012
144d16d56b45 TS demuxer: Add support for PCM variant found on BluRay.
reimar
parents: 34776
diff changeset
2567 case 0x80:
144d16d56b45 TS demuxer: Add support for PCM variant found on BluRay.
reimar
parents: 34776
diff changeset
2568 pmt->es[idx].type = AUDIO_PCM_BR;
144d16d56b45 TS demuxer: Add support for PCM variant found on BluRay.
reimar
parents: 34776
diff changeset
2569 break;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2570 case 0x81:
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2571 pmt->es[idx].type = AUDIO_A52;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2572 break;
18565
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
2573 case 0x8A:
25930
297f24268ce2 in some still unknown system format 0x82 identifies AUDIO_DTS
nicodvb
parents: 25883
diff changeset
2574 case 0x82:
29661
6e5bf32db9ff Add 0x85 ad ID for DTS audio.
diego
parents: 29502
diff changeset
2575 case 0x85:
26229
10bd2e6eee6a another DCA audio identified (0x86) used in BD; patch by kirill belokurov gmail com
nicodvb
parents: 26039
diff changeset
2576 case 0x86:
18565
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
2577 pmt->es[idx].type = AUDIO_DTS;
0eaccc94c90c support for dts (identified only by the PMT, not from the bitstream)
nicodvb
parents: 18564
diff changeset
2578 break;
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
2579 case 0x90:
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
2580 pmt->es[idx].type = SPU_PGS;
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
2581 break;
31261
cd1dd08a0afc Add partial support for dirac to TS demuxer.
reimar
parents: 31225
diff changeset
2582 case 0xD1:
cd1dd08a0afc Add partial support for dirac to TS demuxer.
reimar
parents: 31225
diff changeset
2583 pmt->es[idx].type = VIDEO_DIRAC;
cd1dd08a0afc Add partial support for dirac to TS demuxer.
reimar
parents: 31225
diff changeset
2584 break;
22162
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
2585 case 0xEA:
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
2586 pmt->es[idx].type = VIDEO_VC1;
1ca423133265 vc1 in mpegts
nicodvb
parents: 22050
diff changeset
2587 break;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2588 default:
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2589 mp_msg(MSGT_DEMUX, MSGL_DBG2, "UNKNOWN ES TYPE=0x%x\n", es_type);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2590 pmt->es[idx].type = UNKNOWN;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2591 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2592
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2593 tss = priv->ts.pids[es_pid]; //an ES stream
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2594 if(tss == NULL)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2595 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2596 tss = new_pid(priv, es_pid);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2597 if(tss)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2598 tss->type = pmt->es[idx].type;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2599 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2600
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2601 section_bytes -= 5 + pmt->es[idx].descr_length;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2602 mp_msg(MSGT_DEMUX, MSGL_V, "PARSE_PMT(%d INDEX %d), STREAM: %d, FOUND pid=0x%x (%d), type=0x%x, ES_DESCR_LENGTH: %d, bytes left: %d\n",
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2603 progid, idx, es_count, pmt->es[idx].pid, pmt->es[idx].pid, pmt->es[idx].type, pmt->es[idx].descr_length, section_bytes);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2604
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2605
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2606 es_base += 5 + pmt->es[idx].descr_length;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2607
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2608 es_count++;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2609 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2610
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2611 mp_msg(MSGT_DEMUX, MSGL_V, "----------------------------\n");
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2612 return 1;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2613 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2614
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2615 static pmt_t* pmt_of_pid(ts_priv_t *priv, int pid, mp4_decoder_config_t **mp4_dec)
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2616 {
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2617 int32_t i, j, k;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2618
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2619 if(priv->pmt)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2620 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2621 for(i = 0; i < priv->pmt_cnt; i++)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2622 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2623 if(priv->pmt[i].es && priv->pmt[i].es_cnt)
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2624 {
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2625 for(j = 0; j < priv->pmt[i].es_cnt; j++)
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2626 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2627 if(priv->pmt[i].es[j].pid == pid)
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2628 {
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2629 //search mp4_es_id
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2630 if(priv->pmt[i].es[j].mp4_es_id)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2631 {
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2632 for(k = 0; k < priv->pmt[i].mp4es_cnt; k++)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2633 {
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2634 if(priv->pmt[i].mp4es[k].id == priv->pmt[i].es[j].mp4_es_id)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2635 {
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2636 *mp4_dec = &(priv->pmt[i].mp4es[k].decoder);
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2637 break;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2638 }
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2639 }
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2640 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2641
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2642 return &(priv->pmt[i]);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2643 }
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2644 }
22231
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2645 }
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2646 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2647 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2648
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2649 return NULL;
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2650 }
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2651
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
2652
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
2653 static int32_t pid_type_from_pmt(ts_priv_t *priv, int pid)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2654 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2655 int32_t pmt_idx, pid_idx, i, j;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2656
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2657 pmt_idx = progid_idx_in_pmt(priv, priv->prog);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2658
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2659 if(pmt_idx != -1)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2660 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2661 pid_idx = es_pid_in_pmt(&(priv->pmt[pmt_idx]), pid);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2662 if(pid_idx != -1)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2663 return priv->pmt[pmt_idx].es[pid_idx].type;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2664 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2665 //else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2666 //{
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2667 for(i = 0; i < priv->pmt_cnt; i++)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2668 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2669 pmt_t *pmt = &(priv->pmt[i]);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2670 for(j = 0; j < pmt->es_cnt; j++)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2671 if(pmt->es[j].pid == pid)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2672 return pmt->es[j].type;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2673 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2674 //}
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2675
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2676 return UNKNOWN;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2677 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2678
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2679
35103
5076387577f7 Remove "inline" from functions that are definitely not
reimar
parents: 35012
diff changeset
2680 static uint8_t *pid_lang_from_pmt(ts_priv_t *priv, int pid)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2681 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2682 int32_t pmt_idx, pid_idx, i, j;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2683
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2684 pmt_idx = progid_idx_in_pmt(priv, priv->prog);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2685
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2686 if(pmt_idx != -1)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2687 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2688 pid_idx = es_pid_in_pmt(&(priv->pmt[pmt_idx]), pid);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2689 if(pid_idx != -1)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2690 return priv->pmt[pmt_idx].es[pid_idx].lang;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2691 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2692 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2693 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2694 for(i = 0; i < priv->pmt_cnt; i++)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2695 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2696 pmt_t *pmt = &(priv->pmt[i]);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2697 for(j = 0; j < pmt->es_cnt; j++)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2698 if(pmt->es[j].pid == pid)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2699 return pmt->es[j].lang;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2700 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2701 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2702
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2703 return NULL;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2704 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2705
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2706
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
2707 static int fill_packet(demuxer_t *demuxer, demux_stream_t *ds, demux_packet_t **dp, int *dp_offset, TS_stream_info *si)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2708 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2709 int ret = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2710
32609
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
2711 if(*dp && *dp_offset <= 0)
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
2712 {
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
2713 free_demux_packet(*dp);
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
2714 *dp = NULL;
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
2715 }
3ca30fb56837 Fix several memleaks in TS demuxer.
reimar
parents: 32608
diff changeset
2716 if(*dp)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2717 {
22231
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2718 ret = *dp_offset;
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2719 resize_demux_packet(*dp, ret); //shrinked to the right size
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2720 ds_add_packet(ds, *dp);
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2721 mp_msg(MSGT_DEMUX, MSGL_DBG2, "ADDED %d bytes to %s fifo, PTS=%.3f\n", ret, (ds == demuxer->audio ? "audio" : (ds == demuxer->video ? "video" : "sub")), (*dp)->pts);
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2722 if(si)
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2723 {
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2724 float diff = (*dp)->pts - si->last_pts;
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2725 float dur;
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2726
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2727 if(abs(diff) > 1) //1 second, there's a discontinuity
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
2728 {
22231
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2729 si->duration += si->last_pts - si->first_pts;
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2730 si->first_pts = si->last_pts = (*dp)->pts;
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2731 }
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2732 else
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2733 {
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2734 si->last_pts = (*dp)->pts;
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
2735 }
22231
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2736 si->size += ret;
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2737 dur = si->duration + (si->last_pts - si->first_pts);
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2738
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2739 if(dur > 0 && ds == demuxer->video)
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2740 {
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2741 ts_priv_t * priv = (ts_priv_t*) demuxer->priv;
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2742 if(dur > 1) //otherwise it may be unreliable
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2743 priv->vbitrate = (uint32_t) ((float) si->size / dur);
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2744 }
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
2745 }
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
2746 }
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2747
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2748 *dp = NULL;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2749 *dp_offset = 0;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2750
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2751 return ret;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2752 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2753
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2754 static int fill_extradata(mp4_decoder_config_t * mp4_dec, ES_stream_t *tss)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2755 {
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2756 uint8_t *tmp;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2757
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2758 mp_msg(MSGT_DEMUX, MSGL_DBG2, "MP4_dec: %p, pid: %d\n", mp4_dec, tss->pid);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2759
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2760 if(mp4_dec->buf_size > tss->extradata_alloc)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2761 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30579
diff changeset
2762 tmp = realloc(tss->extradata, mp4_dec->buf_size);
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2763 if(!tmp)
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2764 return 0;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2765 tss->extradata = tmp;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2766 tss->extradata_alloc = mp4_dec->buf_size;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2767 }
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2768 memcpy(tss->extradata, mp4_dec->buf, mp4_dec->buf_size);
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2769 tss->extradata_len = mp4_dec->buf_size;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2770 mp_msg(MSGT_DEMUX, MSGL_V, "EXTRADATA: %p, alloc=%d, len=%d\n", tss->extradata, tss->extradata_alloc, tss->extradata_len);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2771
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2772 return tss->extradata_len;
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2773 }
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2774
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
2775 // 0 = EOF or no stream found
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2776 // else = [-] number of bytes written to the packet
36568
323fb622da7e demux_ts: remove pointless stack variable and ts_parse argument.
reimar
parents: 36379
diff changeset
2777 static int ts_parse(demuxer_t *demuxer , ES_stream_t *es, int probe)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
2778 {
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
2779 ES_stream_t *tss;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2780 int buf_size, is_start, pid, base;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2781 int len, cc, cc_ok, afc, retv = 0, is_video, is_audio, is_sub;
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
2782 ts_priv_t * priv = (ts_priv_t*) demuxer->priv;
36568
323fb622da7e demux_ts: remove pointless stack variable and ts_parse argument.
reimar
parents: 36379
diff changeset
2783 unsigned char *packet = priv->packet;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2784 stream_t *stream = demuxer->stream;
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2785 char *p;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2786 demux_stream_t *ds = NULL;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2787 demux_packet_t **dp = NULL;
12518
996757299a82 removed unused and commented code; audio is pushed synchronously (reported to work better); pid 16 is not default PMT (100l); trails of data are add_packet()ed
nicodvb
parents: 12049
diff changeset
2788 int *dp_offset = 0, *buffer_size = 0;
12049
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
2789 int32_t progid, pid_type, bad, ts_error;
14992
d1d36694aa3d consider parse random_access_point from the adaption_field to determine if the payload is an access point (for SL)
nicodvb
parents: 14981
diff changeset
2790 int junk = 0, rap_flag = 0;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2791 pmt_t *pmt;
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2792 mp4_decoder_config_t *mp4_dec;
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
2793 TS_stream_info *si;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2794
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2795
32606
c3a24e046795 Add memset to avoid using uninitialized data with sample in bug 1280.
reimar
parents: 32580
diff changeset
2796 memset(es, 0, sizeof(*es));
31843
eb85092953c6 Remove an unused variable.
reimar
parents: 31842
diff changeset
2797 while(1)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2798 {
12049
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
2799 bad = ts_error = 0;
31842
cb11684d1b77 Remove some useless casts.
reimar
parents: 31797
diff changeset
2800 ds = NULL;
cb11684d1b77 Remove some useless casts.
reimar
parents: 31797
diff changeset
2801 dp = NULL;
12518
996757299a82 removed unused and commented code; audio is pushed synchronously (reported to work better); pid 16 is not default PMT (100l); trails of data are add_packet()ed
nicodvb
parents: 12049
diff changeset
2802 dp_offset = buffer_size = NULL;
14992
d1d36694aa3d consider parse random_access_point from the adaption_field to determine if the payload is an access point (for SL)
nicodvb
parents: 14981
diff changeset
2803 rap_flag = 0;
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2804 mp4_dec = NULL;
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2805 es->is_synced = 0;
29338
dc46f6bc4610 Initialize es->lang to ensure a previous value does not get misattributed
reimar
parents: 29336
diff changeset
2806 es->lang[0] = 0;
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
2807 si = NULL;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2808
13994
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
2809 junk = priv->ts.packet_size - TS_PACKET_SIZE;
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
2810 buf_size = priv->ts.packet_size - junk;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2811
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2812 if(stream_eof(stream))
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2813 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2814 if(! probe)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2815 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2816 ts_dump_streams(priv);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2817 demuxer->filepos = stream_tell(demuxer->stream);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2818 }
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2819
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2820 return 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2821 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2822
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2823
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2824 if(! ts_sync(stream))
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2825 {
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
2826 mp_msg(MSGT_DEMUX, MSGL_INFO, "TS_PARSE: COULDN'T SYNC\n");
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2827 return 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2828 }
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2829
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2830 len = stream_read(stream, &packet[1], 3);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2831 if (len != 3)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2832 return 0;
20490
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2833 buf_size -= 4;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2834
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2835 if((packet[1] >> 7) & 0x01) //transport error
12049
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
2836 ts_error = 1;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2837
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2838
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2839 is_start = packet[1] & 0x40;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2840 pid = ((packet[1] & 0x1f) << 8) | packet[2];
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2841
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2842 tss = priv->ts.pids[pid]; //an ES stream
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2843 if(tss == NULL)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2844 {
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2845 tss = new_pid(priv, pid);
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2846 if(tss == NULL)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2847 continue;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2848 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2849
20490
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2850 cc = (packet[3] & 0xf);
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2851 cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc));
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2852 tss->last_cc = cc;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2853
20490
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2854 bad = ts_error; // || (! cc_ok);
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2855 if(bad)
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2856 {
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2857 if(priv->keep_broken == 0)
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2858 {
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2859 stream_skip(stream, buf_size-1+junk);
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2860 continue;
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2861 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2862
20490
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2863 is_start = 0; //queued to the packet data
eed38650b528 handle broken ts packets before parsing the rest
nicodvb
parents: 20488
diff changeset
2864 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2865
20462
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
2866 if(is_start)
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
2867 tss->is_synced = 1;
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
2868
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
2869 if((!is_start && !tss->is_synced) || ((pid > 1) && (pid < 16)) || (pid == 8191)) //invalid pid
12049
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
2870 {
13994
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
2871 stream_skip(stream, buf_size-1+junk);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2872 continue;
12049
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
2873 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2874
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2875
14992
d1d36694aa3d consider parse random_access_point from the adaption_field to determine if the payload is an access point (for SL)
nicodvb
parents: 14981
diff changeset
2876 afc = (packet[3] >> 4) & 3;
20464
7b8269775ec0 10l: fixed misplaced adaption field check
nicodvb
parents: 20463
diff changeset
2877 if(! (afc % 2)) //no payload in this TS packet
7b8269775ec0 10l: fixed misplaced adaption field check
nicodvb
parents: 20463
diff changeset
2878 {
7b8269775ec0 10l: fixed misplaced adaption field check
nicodvb
parents: 20463
diff changeset
2879 stream_skip(stream, buf_size-1+junk);
7b8269775ec0 10l: fixed misplaced adaption field check
nicodvb
parents: 20463
diff changeset
2880 continue;
7b8269775ec0 10l: fixed misplaced adaption field check
nicodvb
parents: 20463
diff changeset
2881 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2882
14992
d1d36694aa3d consider parse random_access_point from the adaption_field to determine if the payload is an access point (for SL)
nicodvb
parents: 14981
diff changeset
2883 if(afc > 1)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2884 {
14992
d1d36694aa3d consider parse random_access_point from the adaption_field to determine if the payload is an access point (for SL)
nicodvb
parents: 14981
diff changeset
2885 int c;
d1d36694aa3d consider parse random_access_point from the adaption_field to determine if the payload is an access point (for SL)
nicodvb
parents: 14981
diff changeset
2886 c = stream_read_char(stream);
d1d36694aa3d consider parse random_access_point from the adaption_field to determine if the payload is an access point (for SL)
nicodvb
parents: 14981
diff changeset
2887 buf_size--;
20487
5c953a55103f 1000l: fixed broken handling of the adaption field - part 2
nicodvb
parents: 20486
diff changeset
2888 if(c < 0 || c > 183) //broken from the stream layer or invalid
5c953a55103f 1000l: fixed broken handling of the adaption field - part 2
nicodvb
parents: 20486
diff changeset
2889 {
5c953a55103f 1000l: fixed broken handling of the adaption field - part 2
nicodvb
parents: 20486
diff changeset
2890 stream_skip(stream, buf_size-1+junk);
5c953a55103f 1000l: fixed broken handling of the adaption field - part 2
nicodvb
parents: 20486
diff changeset
2891 continue;
5c953a55103f 1000l: fixed broken handling of the adaption field - part 2
nicodvb
parents: 20486
diff changeset
2892 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2893
20487
5c953a55103f 1000l: fixed broken handling of the adaption field - part 2
nicodvb
parents: 20486
diff changeset
2894 //c==0 is allowed!
5c953a55103f 1000l: fixed broken handling of the adaption field - part 2
nicodvb
parents: 20486
diff changeset
2895 if(c > 0)
5c953a55103f 1000l: fixed broken handling of the adaption field - part 2
nicodvb
parents: 20486
diff changeset
2896 {
26038
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2897 uint8_t pcrbuf[188];
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2898 int flags = stream_read_char(stream);
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2899 int has_pcr;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2900 rap_flag = (flags & 0x40) >> 6;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2901 has_pcr = flags & 0x10;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2902
20488
f485fb548bf3 cosmetics: reformatted after previous commit
nicodvb
parents: 20487
diff changeset
2903 buf_size--;
26038
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2904 c--;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2905 stream_read(stream, pcrbuf, c);
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2906
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2907 if(has_pcr)
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2908 {
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2909 int pcr_pid = prog_pcr_pid(priv, priv->prog);
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2910 if(pcr_pid == pid)
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2911 {
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2912 uint64_t pcr, pcr_ext;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2913
26038
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2914 pcr = (int64_t)(pcrbuf[0]) << 25;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2915 pcr |= pcrbuf[1] << 17 ;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2916 pcr |= (pcrbuf[2]) << 9;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2917 pcr |= pcrbuf[3] << 1 ;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2918 pcr |= (pcrbuf[4] & 0x80) >> 7;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2919
26038
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2920 pcr_ext = (pcrbuf[4] & 0x01) << 8;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2921 pcr_ext |= pcrbuf[5];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2922
26038
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2923 pcr = pcr * 300 + pcr_ext;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2924
26038
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2925 demuxer->reference_clock = (double)pcr/(double)27000000.0;
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2926 }
4f9a30caadff read the PCR of the currently playing program (if available) in demuxer->reference_clock
nicodvb
parents: 25976
diff changeset
2927 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2928
20488
f485fb548bf3 cosmetics: reformatted after previous commit
nicodvb
parents: 20487
diff changeset
2929 buf_size -= c;
f485fb548bf3 cosmetics: reformatted after previous commit
nicodvb
parents: 20487
diff changeset
2930 if(buf_size == 0)
f485fb548bf3 cosmetics: reformatted after previous commit
nicodvb
parents: 20487
diff changeset
2931 continue;
20487
5c953a55103f 1000l: fixed broken handling of the adaption field - part 2
nicodvb
parents: 20486
diff changeset
2932 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2933 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2934
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2935 //find the program that the pid belongs to; if (it's the right one or -1) && pid_type==SL_SECTION
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2936 //call parse_sl_section()
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2937 pmt = pmt_of_pid(priv, pid, &mp4_dec);
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2938 if(mp4_dec)
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2939 {
15045
20ea036e5f0d allocate and fill extradata field for video_avc (raw nal units, extradata contains sps+pps); fixed payload_size assignment for SL payloads
nicodvb
parents: 14993
diff changeset
2940 fill_extradata(mp4_dec, tss);
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2941 if(IS_VIDEO(mp4_dec->object_type) || IS_AUDIO(mp4_dec->object_type))
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2942 {
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2943 tss->type = SL_PES_STREAM;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2944 tss->subtype = mp4_dec->object_type;
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2945 }
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
2946 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2947
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
2948
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2949 //TABLE PARSING
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2950
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2951 base = priv->ts.packet_size - buf_size;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
2952
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2953 priv->last_pid = pid;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2954
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2955 is_video = IS_VIDEO(tss->type) || (tss->type==SL_PES_STREAM && IS_VIDEO(tss->subtype));
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
2956 is_audio = IS_AUDIO(tss->type) || (tss->type==SL_PES_STREAM && IS_AUDIO(tss->subtype)) || (tss->type == PES_PRIVATE1);
29502
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
2957 is_sub = IS_SUB(tss->type);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2958 pid_type = pid_type_from_pmt(priv, pid);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2959
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2960 // PES CONTENT STARTS HERE
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2961 if(! probe)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2962 {
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
2963 if((is_video || is_audio || is_sub) && is_start)
21929
145ca84ffbf7 unified creation of sh_audio and sh_video is ts_add_stream; patch by elupus
nicodvb
parents: 21531
diff changeset
2964 ts_add_stream(demuxer, tss);
20951
55798b61b8ca implemented DEMUXER_CTRL_SWITCH_VIDEO
nicodvb
parents: 20508
diff changeset
2965
55798b61b8ca implemented DEMUXER_CTRL_SWITCH_VIDEO
nicodvb
parents: 20508
diff changeset
2966 if(is_video && (demuxer->video->id == priv->ts.streams[pid].id))
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2967 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2968 ds = demuxer->video;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2969
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2970 dp = &priv->fifo[1].pack;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2971 dp_offset = &priv->fifo[1].offset;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2972 buffer_size = &priv->fifo[1].buffer_size;
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
2973 si = &priv->vstr;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2974 }
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
2975 else if(is_audio && (demuxer->audio->id == priv->ts.streams[pid].id))
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2976 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2977 ds = demuxer->audio;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2978
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2979 dp = &priv->fifo[0].pack;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2980 dp_offset = &priv->fifo[0].offset;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2981 buffer_size = &priv->fifo[0].buffer_size;
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
2982 si = &priv->astr;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
2983 }
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
2984 else if(is_sub)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2985 {
31658
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
2986 sh_sub_t *sh_sub = demuxer->sub->sh;
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
2987
66795d9dcb51 Improve MPEG-TS subtitle support: make it use the infrastructure for
reimar
parents: 31609
diff changeset
2988 if(sh_sub && sh_sub->sid == tss->pid)
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2989 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2990 ds = demuxer->sub;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2991
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2992 dp = &priv->fifo[2].pack;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2993 dp_offset = &priv->fifo[2].offset;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2994 buffer_size = &priv->fifo[2].buffer_size;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2995 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2996 else
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2997 {
13994
a3a16a50b314 added support for 192 packet size, remove junk data after 188 bytes. Patch by Marcus Metzler (mocm@mocm.de)
nicodvb
parents: 13957
diff changeset
2998 stream_skip(stream, buf_size+junk);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
2999 continue;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3000 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3001 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3002
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3003 //IS IT TIME TO QUEUE DATA to the dp_packet?
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3004 if(is_start && (dp != NULL))
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3005 {
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
3006 retv = fill_packet(demuxer, ds, dp, dp_offset, si);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3007 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3008
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3009
20508
f74eb19ac068 a previous commit introduced a bug that prevented tables
nicodvb
parents: 20506
diff changeset
3010 if(dp && *dp == NULL)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3011 {
18461
e98125844f2d don't allocate (and demux_push() immediately) demux_packet()s > MAX_PACK_SIZE; releasing immediately audio packets (before the pes is complete) doesn't make any sense and deteriorates interleaving
nicodvb
parents: 18460
diff changeset
3012 if(*buffer_size > MAX_PACK_BYTES)
e98125844f2d don't allocate (and demux_push() immediately) demux_packet()s > MAX_PACK_SIZE; releasing immediately audio packets (before the pes is complete) doesn't make any sense and deteriorates interleaving
nicodvb
parents: 18460
diff changeset
3013 *buffer_size = MAX_PACK_BYTES;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3014 *dp = new_demux_packet(*buffer_size); //es->size
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3015 *dp_offset = 0;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3016 if(! *dp)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3017 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3018 fprintf(stderr, "fill_buffer, NEW_ADD_PACKET(%d)FAILED\n", *buffer_size);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3019 continue;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3020 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3021 mp_msg(MSGT_DEMUX, MSGL_DBG2, "CREATED DP(%d)\n", *buffer_size);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3022 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3023 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3024
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3025
20485
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3026 if(probe || !dp) //dp is NULL for tables and sections
20478
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3027 {
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3028 p = &packet[base];
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3029 }
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3030 else //feeding
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3031 {
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3032 if(*dp_offset + buf_size > *buffer_size)
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3033 {
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3034 *buffer_size = *dp_offset + buf_size + TS_FEC_PACKET_SIZE;
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3035 resize_demux_packet(*dp, *buffer_size);
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3036 }
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3037 p = &((*dp)->buffer[*dp_offset]);
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3038 }
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3039
20486
0cc36dd385ec fixed mishandling of stream_read() (it doesn't necessarily return -1 in case of error)
nicodvb
parents: 20485
diff changeset
3040 len = stream_read(stream, p, buf_size);
0cc36dd385ec fixed mishandling of stream_read() (it doesn't necessarily return -1 in case of error)
nicodvb
parents: 20485
diff changeset
3041 if(len < buf_size)
20478
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3042 {
20486
0cc36dd385ec fixed mishandling of stream_read() (it doesn't necessarily return -1 in case of error)
nicodvb
parents: 20485
diff changeset
3043 mp_msg(MSGT_DEMUX, MSGL_DBG2, "\r\nts_parse() couldn't read enough data: %d < %d\r\n", len, buf_size);
20478
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3044 continue;
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3045 }
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3046 stream_skip(stream, junk);
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3047
20485
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3048 if(pid == 0)
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3049 {
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3050 parse_pat(priv, is_start, p, buf_size);
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3051 continue;
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3052 }
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3053 else if((tss->type == SL_SECTION) && pmt)
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3054 {
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3055 int k, mp4_es_id = -1;
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3056 ts_section_t *section;
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3057 for(k = 0; k < pmt->mp4es_cnt; k++)
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3058 {
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3059 if(pmt->mp4es[k].decoder.object_type == MP4_OD && pmt->mp4es[k].decoder.stream_type == MP4_OD)
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3060 mp4_es_id = pmt->mp4es[k].id;
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3061 }
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3062 mp_msg(MSGT_DEMUX, MSGL_DBG2, "MP4ESID: %d\n", mp4_es_id);
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3063 for(k = 0; k < pmt->es_cnt; k++)
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3064 {
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3065 if(pmt->es[k].mp4_es_id == mp4_es_id)
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3066 {
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3067 section = &(tss->section);
24570
2ab48a4978d4 removed unused function parameters
nicodvb
parents: 24569
diff changeset
3068 parse_sl_section(pmt, section, is_start, &packet[base], buf_size);
20485
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3069 }
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3070 }
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3071 continue;
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3072 }
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3073 else
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3074 {
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3075 progid = prog_id_in_pat(priv, pid);
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3076 if(progid != -1)
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3077 {
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3078 if(pid != demuxer->video->id && pid != demuxer->audio->id && pid != demuxer->sub->id)
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3079 {
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3080 parse_pmt(priv, progid, pid, is_start, &packet[base], buf_size);
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3081 continue;
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3082 }
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3083 else
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3084 mp_msg(MSGT_DEMUX, MSGL_ERR, "Argh! Data pid %d used in the PMT, Skipping PMT parsing!\n", pid);
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3085 }
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3086 }
8fb92804c652 ts_parse() move section handling after stream_read() rather than repeating it
nicodvb
parents: 20480
diff changeset
3087
20508
f74eb19ac068 a previous commit introduced a bug that prevented tables
nicodvb
parents: 20506
diff changeset
3088 if(!probe && !dp)
f74eb19ac068 a previous commit introduced a bug that prevented tables
nicodvb
parents: 20506
diff changeset
3089 continue;
f74eb19ac068 a previous commit introduced a bug that prevented tables
nicodvb
parents: 20506
diff changeset
3090
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3091 if(is_start)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3092 {
20471
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3093 uint8_t *lang = NULL;
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3094
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3095 mp_msg(MSGT_DEMUX, MSGL_DBG2, "IS_START\n");
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3096
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
3097 len = pes_parse2(p, buf_size, es, pid_type, pmt, pid);
20462
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
3098 if(! len)
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
3099 {
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
3100 tss->is_synced = 0;
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
3101 continue;
548a0b532ca2 slight simplifications
nicodvb
parents: 20283
diff changeset
3102 }
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3103 es->pid = tss->pid;
15075
737cc83784fb set width, height and biCompression when the video stream contains avc1; reuse a private member rather than a in-stack packet[204]; set pes_es->is_synced =1 when au_start=1 (SL); update PMT when setting mp4es codec (SL); fix tss->is_synced assignment (don't forget the value when it was previously set)
nicodvb
parents: 15067
diff changeset
3104 tss->is_synced |= es->is_synced || rap_flag;
20471
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3105 tss->payload_size = es->payload_size;
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3106
29502
9fa45a007afe Add suport for detecting and demuxing DVB teletext streams (nothing beyond that though).
reimar
parents: 29415
diff changeset
3107 if((is_sub || is_audio) && (lang = pid_lang_from_pmt(priv, es->pid)))
20471
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3108 {
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3109 memcpy(es->lang, lang, 3);
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3110 es->lang[3] = 0;
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3111 }
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3112 else
0398b9cbd66d unconditionally assign the language code when available;
nicodvb
parents: 20467
diff changeset
3113 es->lang[0] = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
3114
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3115 if(probe)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3116 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3117 if(es->type == UNKNOWN)
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3118 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
3119
20467
67dd5d97176e reformatted ts_parse() after previous commit
nicodvb
parents: 20465
diff changeset
3120 tss->type = es->type;
67dd5d97176e reformatted ts_parse() after previous commit
nicodvb
parents: 20465
diff changeset
3121 tss->subtype = es->subtype;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
3122
20467
67dd5d97176e reformatted ts_parse() after previous commit
nicodvb
parents: 20465
diff changeset
3123 return 1;
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3124 }
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3125 else
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3126 {
30257
77265abe0200 Use double-precision constants instead of single precision that gets cast to double.
reimar
parents: 30256
diff changeset
3127 if(es->pts == 0.0)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3128 es->pts = tss->pts = tss->last_pts;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3129 else
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3130 tss->pts = tss->last_pts = es->pts;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3131
12049
5da6a113b6af fix wrong detection of mpeg4 as mpeg2 and wrong handling of discontinuities/transport error bit
nicodvb
parents: 11412
diff changeset
3132 mp_msg(MSGT_DEMUX, MSGL_DBG2, "ts_parse, NEW pid=%d, PSIZE: %u, type=%X, start=%p, len=%d\n",
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3133 es->pid, es->payload_size, es->type, es->start, es->size);
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3134
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3135 demuxer->filepos = stream_tell(demuxer->stream) - es->size;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3136
31603
2b455d7357cc Check packet size before memmove to avoid crashes e.g. if we recognized the
reimar
parents: 31474
diff changeset
3137 if(es->size < 0 || es->size > buf_size) {
2b455d7357cc Check packet size before memmove to avoid crashes e.g. if we recognized the
reimar
parents: 31474
diff changeset
3138 mp_msg(MSGT_DEMUX, MSGL_ERR, "Broken ES packet size\n");
2b455d7357cc Check packet size before memmove to avoid crashes e.g. if we recognized the
reimar
parents: 31474
diff changeset
3139 es->size = 0;
2b455d7357cc Check packet size before memmove to avoid crashes e.g. if we recognized the
reimar
parents: 31474
diff changeset
3140 }
20478
c8bc7d300bb3 in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
nicodvb
parents: 20472
diff changeset
3141 memmove(p, es->start, es->size);
20467
67dd5d97176e reformatted ts_parse() after previous commit
nicodvb
parents: 20465
diff changeset
3142 *dp_offset += es->size;
67dd5d97176e reformatted ts_parse() after previous commit
nicodvb
parents: 20465
diff changeset
3143 (*dp)->flags = 0;
67dd5d97176e reformatted ts_parse() after previous commit
nicodvb
parents: 20465
diff changeset
3144 (*dp)->pos = stream_tell(demuxer->stream);
67dd5d97176e reformatted ts_parse() after previous commit
nicodvb
parents: 20465
diff changeset
3145 (*dp)->pts = es->pts;
32777
9cc2689e5cd1 Fix r32587: the previous approach to return subtitles in time broke
reimar
parents: 32775
diff changeset
3146 // subtitle packets must be returned immediately if possible
9cc2689e5cd1 Fix r32587: the previous approach to return subtitles in time broke
reimar
parents: 32775
diff changeset
3147 if (is_sub && !tss->payload_size)
9cc2689e5cd1 Fix r32587: the previous approach to return subtitles in time broke
reimar
parents: 32775
diff changeset
3148 retv = fill_packet(demuxer, ds, dp, dp_offset, si);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3149
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3150 if(retv > 0)
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3151 return retv;
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3152 else
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3153 continue;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3154 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3155 }
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
3156 else
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
3157 {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3158 uint16_t sz;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3159
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3160 es->pid = tss->pid;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3161 es->type = tss->type;
14968
b5fb8b0b07c5 initial support for SL packetized data, with certain limitations; partly reworked the tables management for a better code reuse
nicodvb
parents: 14825
diff changeset
3162 es->subtype = tss->subtype;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3163 es->pts = tss->pts = tss->last_pts;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3164 es->start = &packet[base];
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3165
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3166
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3167 if(tss->payload_size > 0)
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3168 {
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21421
diff changeset
3169 sz = FFMIN(tss->payload_size, buf_size);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3170 tss->payload_size -= sz;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3171 es->size = sz;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3172 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3173 else
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3174 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3175 if(is_video)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3176 {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3177 sz = es->size = buf_size;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3178 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3179 else
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3180 {
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3181 continue;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3182 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3183 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3184
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3185
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3186 if(! probe)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3187 {
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3188 *dp_offset += sz;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3189
32777
9cc2689e5cd1 Fix r32587: the previous approach to return subtitles in time broke
reimar
parents: 32775
diff changeset
3190 // subtitle packets must be returned immediately if possible
9cc2689e5cd1 Fix r32587: the previous approach to return subtitles in time broke
reimar
parents: 32775
diff changeset
3191 if(*dp_offset >= MAX_PACK_BYTES || (is_sub && !tss->payload_size))
12518
996757299a82 removed unused and commented code; audio is pushed synchronously (reported to work better); pid 16 is not default PMT (100l); trails of data are add_packet()ed
nicodvb
parents: 12049
diff changeset
3192 {
12612
a731d98a3382 added support for ac3 in non-pes aligned private1 streams; removed useless and commented code
nicodvb
parents: 12518
diff changeset
3193 (*dp)->pts = tss->last_pts;
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
3194 retv = fill_packet(demuxer, ds, dp, dp_offset, si);
12518
996757299a82 removed unused and commented code; audio is pushed synchronously (reported to work better); pid 16 is not default PMT (100l); trails of data are add_packet()ed
nicodvb
parents: 12049
diff changeset
3195 return 1;
996757299a82 removed unused and commented code; audio is pushed synchronously (reported to work better); pid 16 is not default PMT (100l); trails of data are add_packet()ed
nicodvb
parents: 12049
diff changeset
3196 }
996757299a82 removed unused and commented code; audio is pushed synchronously (reported to work better); pid 16 is not default PMT (100l); trails of data are add_packet()ed
nicodvb
parents: 12049
diff changeset
3197
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3198 continue;
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3199 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3200 else
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3201 {
32610
2e5c286a464a Replace memcpy with memove since at least src==dst is possible.
reimar
parents: 32609
diff changeset
3202 memmove(es->start, p, sz);
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3203
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3204 if(es->size)
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3205 return es->size;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3206 else
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3207 continue;
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3208 }
10014
01a9af06319a fully reworked by Nico <nsabbi@libero.it>
alex
parents: 9638
diff changeset
3209 }
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3210 }
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3211
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3212 return 0;
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
3213 }
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
3214
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
3215
26039
aa0784c046d1 reset_fifos() resets demuxer->reference_clock to MP_NOPTS_VALUE
nicodvb
parents: 26038
diff changeset
3216 static void reset_fifos(demuxer_t *demuxer, int a, int v, int s)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3217 {
26039
aa0784c046d1 reset_fifos() resets demuxer->reference_clock to MP_NOPTS_VALUE
nicodvb
parents: 26038
diff changeset
3218 ts_priv_t* priv = demuxer->priv;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3219 if(a)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3220 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3221 if(priv->fifo[0].pack != NULL)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3222 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3223 free_demux_packet(priv->fifo[0].pack);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3224 priv->fifo[0].pack = NULL;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3225 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3226 priv->fifo[0].offset = 0;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3227 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3228
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3229 if(v)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3230 {
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3231 if(priv->fifo[1].pack != NULL)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3232 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3233 free_demux_packet(priv->fifo[1].pack);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3234 priv->fifo[1].pack = NULL;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3235 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3236 priv->fifo[1].offset = 0;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3237 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3238
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3239 if(s)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3240 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3241 if(priv->fifo[2].pack != NULL)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3242 {
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3243 free_demux_packet(priv->fifo[2].pack);
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3244 priv->fifo[2].pack = NULL;
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3245 }
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3246 priv->fifo[2].offset = 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3247 }
26039
aa0784c046d1 reset_fifos() resets demuxer->reference_clock to MP_NOPTS_VALUE
nicodvb
parents: 26038
diff changeset
3248 demuxer->reference_clock = MP_NOPTS_VALUE;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3249 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3250
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3251
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
3252 static void demux_seek_ts(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3253 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3254 demux_stream_t *d_audio=demuxer->audio;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3255 demux_stream_t *d_video=demuxer->video;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3256 sh_audio_t *sh_audio=d_audio->sh;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3257 sh_video_t *sh_video=d_video->sh;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3258 ts_priv_t * priv = (ts_priv_t*) demuxer->priv;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3259 int i, video_stats;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3260 off_t newpos;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3261
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3262 //================= seek in MPEG-TS ==========================
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3263
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3264 ts_dump_streams(demuxer->priv);
26039
aa0784c046d1 reset_fifos() resets demuxer->reference_clock to MP_NOPTS_VALUE
nicodvb
parents: 26038
diff changeset
3265 reset_fifos(demuxer, sh_audio != NULL, sh_video != NULL, demuxer->sub->id > 0);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3266
26928
942e562ca4a9 call demux_flush() where appropriate
nicodvb
parents: 26363
diff changeset
3267 demux_flush(demuxer);
942e562ca4a9 call demux_flush() where appropriate
nicodvb
parents: 26363
diff changeset
3268
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3269
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3270
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3271 video_stats = (sh_video != NULL);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3272 if(video_stats)
16883
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
3273 {
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
3274 mp_msg(MSGT_DEMUX, MSGL_V, "IBPS: %d, vb: %d\r\n", sh_video->i_bps, priv->vbitrate);
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
3275 if(priv->vbitrate)
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
3276 video_stats = priv->vbitrate;
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
3277 else
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
3278 video_stats = sh_video->i_bps;
1f45d7872c56 more precise seeking based on calculated average video bitrate; works quite well in case of a TS with only 1 video stream
nicodvb
parents: 16877
diff changeset
3279 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3280
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25837
diff changeset
3281 newpos = (flags & SEEK_ABSOLUTE) ? demuxer->movi_start : demuxer->filepos;
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25837
diff changeset
3282 if(flags & SEEK_FACTOR) // float seek 0..1
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3283 newpos+=(demuxer->movi_end-demuxer->movi_start)*rel_seek_secs;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3284 else
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3285 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3286 // time seek (secs)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3287 if(! video_stats) // unspecified or VBR
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3288 newpos += 2324*75*rel_seek_secs; // 174.3 kbyte/sec
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3289 else
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3290 newpos += video_stats*rel_seek_secs;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3291 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3292
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3293
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3294 if(newpos < demuxer->movi_start)
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3295 newpos = demuxer->movi_start; //begininng of stream
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3296
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3297 stream_seek(demuxer->stream, newpos);
32608
75c7654261d0 Replace hard-coded number for loop limits for array index by
reimar
parents: 32607
diff changeset
3298 for(i = 0; i < NB_PID_MAX; i++)
14981
293d3dee2eae SL payloads are pushed to audio and video fifo only when they are flagged with random_accesspoint or access_unit_start
nicodvb
parents: 14968
diff changeset
3299 if(priv->ts.pids[i] != NULL)
293d3dee2eae SL payloads are pushed to audio and video fifo only when they are flagged with random_accesspoint or access_unit_start
nicodvb
parents: 14968
diff changeset
3300 priv->ts.pids[i]->is_synced = 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3301
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3302 videobuf_code_len = 0;
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3303
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3304 if(sh_video != NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3305 ds_fill_buffer(d_video);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3306
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3307 if(sh_audio != NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3308 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3309 ds_fill_buffer(d_audio);
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3310 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3311
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3312 while(sh_video != NULL)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3313 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3314 if(sh_audio && !d_audio->eof && d_video->pts && d_audio->pts)
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3315 {
30256
c116c83f6268 Use double instead of float for pts.
cehoyos
parents: 30088
diff changeset
3316 double a_pts=d_audio->pts;
c116c83f6268 Use double instead of float for pts.
cehoyos
parents: 30088
diff changeset
3317 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(double)sh_audio->i_bps;
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3318 if(d_video->pts > a_pts)
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3319 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3320 skip_audio_frame(sh_audio); // sync audio
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3321 continue;
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3322 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3323 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3324
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3325
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3326 i = sync_video_packet(d_video);
11190
dad43bc55cfc big demux_ts fix from Nico <nsabbi@libero.it>
attila
parents: 10841
diff changeset
3327 if((sh_video->format == VIDEO_MPEG1) || (sh_video->format == VIDEO_MPEG2))
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3328 {
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3329 if(i==0x1B3 || i==0x1B8) break; // found it!
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3330 }
22231
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
3331 else if((sh_video->format == VIDEO_MPEG4) && (i==0x1B6))
da19b4ccb83a cosmetics
nicodvb
parents: 22165
diff changeset
3332 break;
22163
0e60f69c9dc4 when playing vc1 content sync to sequence or entry point header
nicodvb
parents: 22162
diff changeset
3333 else if(sh_video->format == VIDEO_VC1 && (i==0x10E || i==0x10F))
0e60f69c9dc4 when playing vc1 content sync to sequence or entry point header
nicodvb
parents: 22162
diff changeset
3334 break;
36379
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
3335 else if(sh_video->format == VIDEO_HEVC)
847bc950322a Support HEVC in native mpeg-ts demuxer.
cehoyos
parents: 35254
diff changeset
3336 break;
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 13994
diff changeset
3337 else //H264
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 13994
diff changeset
3338 {
25976
7e297cec88aa when seeking in H264 an SPS *should* be a valid entry point; feel free to change it if it's wrong
nicodvb
parents: 25975
diff changeset
3339 if((i & ~0x60) == 0x105 || (i & ~0x60) == 0x107) break;
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 13994
diff changeset
3340 }
10686
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3341
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3342 if(!i || !skip_video_packet(d_video)) break; // EOF?
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3343 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3344 }
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3345
8eb690f0e342 - seek() is always synchronized to keyframes, so the decoders don't
arpi
parents: 10310
diff changeset
3346
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3347 static int demux_ts_fill_buffer(demuxer_t * demuxer, demux_stream_t *ds)
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
3348 {
10253
978b12dcb9ef - open new_ds_[audio | video] only when the relative streams are really available
arpi
parents: 10242
diff changeset
3349 ES_stream_t es;
36568
323fb622da7e demux_ts: remove pointless stack variable and ts_parse argument.
reimar
parents: 36379
diff changeset
3350
323fb622da7e demux_ts: remove pointless stack variable and ts_parse argument.
reimar
parents: 36379
diff changeset
3351 return -ts_parse(demuxer, &es, 0);
9610
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
3352 }
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
3353
76c6d8f1ebf5 this is a combo patch that:
arpi
parents:
diff changeset
3354
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3355 static int ts_check_file_dmx(demuxer_t *demuxer)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3356 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3357 return ts_check_file(demuxer) ? DEMUXER_TYPE_MPEG_TS : 0;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3358 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3359
21006
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3360 static int is_usable_program(ts_priv_t *priv, pmt_t *pmt)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3361 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3362 int j;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3363
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3364 for(j = 0; j < pmt->es_cnt; j++)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3365 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3366 if(priv->ts.pids[pmt->es[j].pid] == NULL || priv->ts.streams[pmt->es[j].pid].sh == NULL)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3367 continue;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3368 if(
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3369 priv->ts.streams[pmt->es[j].pid].type == TYPE_VIDEO ||
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3370 priv->ts.streams[pmt->es[j].pid].type == TYPE_AUDIO
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3371 )
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3372 return 1;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3373 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3374
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3375 return 0;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3376 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3377
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3378 static int demux_ts_control(demuxer_t *demuxer, int cmd, void *arg)
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3379 {
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3380 ts_priv_t* priv = (ts_priv_t *)demuxer->priv;
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3381
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3382 switch(cmd)
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3383 {
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3384 case DEMUXER_CTRL_SWITCH_AUDIO:
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3385 case DEMUXER_CTRL_SWITCH_VIDEO:
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3386 {
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3387 void *sh = NULL;
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3388 int i, n;
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3389 int reftype, areset = 0, vreset = 0;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3390 demux_stream_t *ds;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29237
diff changeset
3391
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3392 if(cmd == DEMUXER_CTRL_SWITCH_VIDEO)
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3393 {
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3394 reftype = TYPE_VIDEO;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3395 ds = demuxer->video;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3396 vreset = 1;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3397 }
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3398 else
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3399 {
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3400 reftype = TYPE_AUDIO;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3401 ds = demuxer->audio;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3402 areset = 1;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3403 }
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3404 n = *((int*)arg);
21067
baf2e8bed3d1 during DEMUXER_CTRL_SWITCH_x *arg set to -2 identifies 'disable stream x'
nicodvb
parents: 21006
diff changeset
3405 if(n == -2)
baf2e8bed3d1 during DEMUXER_CTRL_SWITCH_x *arg set to -2 identifies 'disable stream x'
nicodvb
parents: 21006
diff changeset
3406 {
26039
aa0784c046d1 reset_fifos() resets demuxer->reference_clock to MP_NOPTS_VALUE
nicodvb
parents: 26038
diff changeset
3407 reset_fifos(demuxer, areset, vreset, 0);
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3408 ds->id = -2;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3409 ds->sh = NULL;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3410 ds_free_packs(ds);
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3411 *((int*)arg) = ds->id;
21067
baf2e8bed3d1 during DEMUXER_CTRL_SWITCH_x *arg set to -2 identifies 'disable stream x'
nicodvb
parents: 21006
diff changeset
3412 return DEMUXER_CTRL_OK;
baf2e8bed3d1 during DEMUXER_CTRL_SWITCH_x *arg set to -2 identifies 'disable stream x'
nicodvb
parents: 21006
diff changeset
3413 }
baf2e8bed3d1 during DEMUXER_CTRL_SWITCH_x *arg set to -2 identifies 'disable stream x'
nicodvb
parents: 21006
diff changeset
3414
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3415 if(n < 0)
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3416 {
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3417 for(i = 0; i < 8192; i++)
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3418 {
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3419 if(priv->ts.streams[i].id == ds->id && priv->ts.streams[i].type == reftype)
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3420 break;
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3421 }
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3422
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3423 while(!sh)
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3424 {
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3425 i = (i+1) % 8192;
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3426 if(priv->ts.streams[i].type == reftype)
20954
bd634deaaec7 restored circular looping when changing audio and video stream (previously broken)
nicodvb
parents: 20952
diff changeset
3427 {
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3428 if(priv->ts.streams[i].id == ds->id) //we made a complete loop
20955
8f257751831f COSMETICS: reformatted
nicodvb
parents: 20954
diff changeset
3429 break;
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3430 sh = priv->ts.streams[i].sh;
20954
bd634deaaec7 restored circular looping when changing audio and video stream (previously broken)
nicodvb
parents: 20952
diff changeset
3431 }
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3432 }
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3433 }
21099
7901c90ac6ac slight simplification in demux_control_ts: no need to check *arg with last_{aid,vid} (small bugfix, too)
nicodvb
parents: 21072
diff changeset
3434 else //audio track <n>
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3435 {
29335
5f45df619c7c TS demuxer: make the IDs used by DEMUXER_CTRL_SWITCH_* and DEMUXER_CTRL_IDENTIFY_PROGRAM
reimar
parents: 29263
diff changeset
3436 if (n >= 8192 || priv->ts.streams[n].type != reftype) return DEMUXER_CTRL_NOTIMPL;
5f45df619c7c TS demuxer: make the IDs used by DEMUXER_CTRL_SWITCH_* and DEMUXER_CTRL_IDENTIFY_PROGRAM
reimar
parents: 29263
diff changeset
3437 i = n;
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3438 sh = priv->ts.streams[i].sh;
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3439 }
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3440
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3441 if(sh)
20951
55798b61b8ca implemented DEMUXER_CTRL_SWITCH_VIDEO
nicodvb
parents: 20508
diff changeset
3442 {
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3443 if(ds->id != priv->ts.streams[i].id)
26039
aa0784c046d1 reset_fifos() resets demuxer->reference_clock to MP_NOPTS_VALUE
nicodvb
parents: 26038
diff changeset
3444 reset_fifos(demuxer, areset, vreset, 0);
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3445 ds->id = priv->ts.streams[i].id;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3446 ds->sh = sh;
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3447 ds_free_packs(ds);
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3448 mp_msg(MSGT_DEMUX, MSGL_V, "\r\ndemux_ts, switched to audio pid %d, id: %d, sh: %p\r\n", i, ds->id, sh);
20951
55798b61b8ca implemented DEMUXER_CTRL_SWITCH_VIDEO
nicodvb
parents: 20508
diff changeset
3449 }
21072
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3450
e45dc4e170a5 in demux_ts_control unified SWITCH_AUDIO and SWITCH_VIDEO (they were identical)
nicodvb
parents: 21067
diff changeset
3451 *((int*)arg) = ds->id;
20951
55798b61b8ca implemented DEMUXER_CTRL_SWITCH_VIDEO
nicodvb
parents: 20508
diff changeset
3452 return DEMUXER_CTRL_OK;
55798b61b8ca implemented DEMUXER_CTRL_SWITCH_VIDEO
nicodvb
parents: 20508
diff changeset
3453 }
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3454
21006
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3455 case DEMUXER_CTRL_IDENTIFY_PROGRAM: //returns in prog->{aid,vid} the new ids that comprise a program
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3456 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3457 int i, j, cnt=0;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3458 int vid_done=0, aid_done=0;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3459 pmt_t *pmt = NULL;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3460 demux_program_t *prog = arg;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3461
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3462 if(priv->pmt_cnt < 2)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3463 return DEMUXER_CTRL_NOTIMPL;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3464
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3465 if(prog->progid == -1)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3466 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3467 int cur_pmt_idx = 0;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3468
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3469 for(i = 0; i < priv->pmt_cnt; i++)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3470 if(priv->pmt[i].progid == priv->prog)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3471 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3472 cur_pmt_idx = i;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3473 break;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3474 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3475
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3476 i = (cur_pmt_idx + 1) % priv->pmt_cnt;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3477 while(i != cur_pmt_idx)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3478 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3479 pmt = &priv->pmt[i];
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3480 cnt = is_usable_program(priv, pmt);
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3481 if(cnt)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3482 break;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3483 i = (i + 1) % priv->pmt_cnt;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3484 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3485 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3486 else
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3487 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3488 for(i = 0; i < priv->pmt_cnt; i++)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3489 if(priv->pmt[i].progid == prog->progid)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3490 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3491 pmt = &priv->pmt[i]; //required program
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3492 cnt = is_usable_program(priv, pmt);
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3493 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3494 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3495
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3496 if(!cnt)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3497 return DEMUXER_CTRL_NOTIMPL;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3498
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3499 //finally some food
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3500 prog->aid = prog->vid = -2; //no audio and no video by default
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3501 for(j = 0; j < pmt->es_cnt; j++)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3502 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3503 if(priv->ts.pids[pmt->es[j].pid] == NULL || priv->ts.streams[pmt->es[j].pid].sh == NULL)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3504 continue;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3505
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3506 if(!vid_done && priv->ts.streams[pmt->es[j].pid].type == TYPE_VIDEO)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3507 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3508 vid_done = 1;
29335
5f45df619c7c TS demuxer: make the IDs used by DEMUXER_CTRL_SWITCH_* and DEMUXER_CTRL_IDENTIFY_PROGRAM
reimar
parents: 29263
diff changeset
3509 prog->vid = pmt->es[j].pid;
21006
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3510 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3511 else if(!aid_done && priv->ts.streams[pmt->es[j].pid].type == TYPE_AUDIO)
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3512 {
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3513 aid_done = 1;
29335
5f45df619c7c TS demuxer: make the IDs used by DEMUXER_CTRL_SWITCH_* and DEMUXER_CTRL_IDENTIFY_PROGRAM
reimar
parents: 29263
diff changeset
3514 prog->aid = pmt->es[j].pid;
21006
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3515 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3516 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3517
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3518 priv->prog = prog->progid = pmt->progid;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3519 return DEMUXER_CTRL_OK;
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3520 }
deafbd2533df implemented DEMUXER_CTRL_IDENTIFY_PROGRAM
nicodvb
parents: 20955
diff changeset
3521
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3522 default:
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3523 return DEMUXER_CTRL_NOTIMPL;
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3524 }
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3525 }
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3526
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3527
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25571
diff changeset
3528 const demuxer_desc_t demuxer_desc_mpeg_ts = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3529 "MPEG-TS demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3530 "mpegts",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3531 "TS",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3532 "Nico Sabbi",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3533 "",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3534 DEMUXER_TYPE_MPEG_TS,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3535 0, // unsafe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3536 ts_check_file_dmx,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3537 demux_ts_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3538 demux_open_ts,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3539 demux_close_ts,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3540 demux_seek_ts,
18688
a109f55ad8d8 support for audio stream switching
nicodvb
parents: 18565
diff changeset
3541 demux_ts_control
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15669
diff changeset
3542 };