Mercurial > libavformat.hg
annotate mpegtsenc.c @ 5786:7d670040187e libavformat
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
Improve ther error message when bitstream is malformated and tell user to use
the bitstream filter.
author | bcoudurier |
---|---|
date | Mon, 08 Mar 2010 23:59:05 +0000 |
parents | 28885ab1ef1c |
children | 667736f463b3 |
rev | line source |
---|---|
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
1 /* |
1415
3b00fb8ef8e4
replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents:
1358
diff
changeset
|
2 * MPEG2 transport stream (aka DVB) muxer |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4220
diff
changeset
|
3 * Copyright (c) 2003 Fabrice Bellard |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
16 * |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
887
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
20 */ |
3286 | 21 |
4201
7d2f3f1b68d8
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
3719
diff
changeset
|
22 #include "libavutil/bswap.h" |
3286 | 23 #include "libavutil/crc.h" |
4211
5e5654752973
set pts and dts of pes packets exactly according to specs
bcoudurier
parents:
4209
diff
changeset
|
24 #include "libavcodec/mpegvideo.h" |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
25 #include "avformat.h" |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
26 #include "mpegts.h" |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
27 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
28 /* write DVB SI sections */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
29 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
30 /*********************************************/ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
31 /* mpegts section writer */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
32 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
33 typedef struct MpegTSSection { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
34 int pid; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
35 int cc; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
36 void (*write_packet)(struct MpegTSSection *s, const uint8_t *packet); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
37 void *opaque; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
38 } MpegTSSection; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
39 |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
40 typedef struct MpegTSService { |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
41 MpegTSSection pmt; /* MPEG2 pmt table context */ |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
42 int sid; /* service ID */ |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
43 char *name; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
44 char *provider_name; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
45 int pcr_pid; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
46 int pcr_packet_count; |
5115
640c875b3bfe
rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents:
4952
diff
changeset
|
47 int pcr_packet_period; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
48 } MpegTSService; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
49 |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
50 typedef struct MpegTSWrite { |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
51 MpegTSSection pat; /* MPEG2 pat table */ |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
52 MpegTSSection sdt; /* MPEG2 sdt table context */ |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
53 MpegTSService **services; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
54 int sdt_packet_count; |
5115
640c875b3bfe
rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents:
4952
diff
changeset
|
55 int sdt_packet_period; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
56 int pat_packet_count; |
5115
640c875b3bfe
rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents:
4952
diff
changeset
|
57 int pat_packet_period; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
58 int nb_services; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
59 int onid; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
60 int tsid; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
61 uint64_t cur_pcr; |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
62 int mux_rate; ///< set to 1 when VBR |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
63 } MpegTSWrite; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
64 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
65 /* NOTE: 4 bytes must be left at the end for the crc32 */ |
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
996
diff
changeset
|
66 static void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len) |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
67 { |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
68 MpegTSWrite *ts = ((AVFormatContext*)s->opaque)->priv_data; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
69 unsigned int crc; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
70 unsigned char packet[TS_PACKET_SIZE]; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
71 const unsigned char *buf_ptr; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
72 unsigned char *q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
73 int first, b, len1, left; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
74 |
2893 | 75 crc = bswap_32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, buf, len - 4)); |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
76 buf[len - 4] = (crc >> 24) & 0xff; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
77 buf[len - 3] = (crc >> 16) & 0xff; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
78 buf[len - 2] = (crc >> 8) & 0xff; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
79 buf[len - 1] = (crc) & 0xff; |
885 | 80 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
81 /* send each packet */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
82 buf_ptr = buf; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
83 while (len > 0) { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
84 first = (buf == buf_ptr); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
85 q = packet; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
86 *q++ = 0x47; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
87 b = (s->pid >> 8); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
88 if (first) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
89 b |= 0x40; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
90 *q++ = b; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
91 *q++ = s->pid; |
5709
bdcd3e540558
Correctly increment continuity_counter in PCR packets.
cehoyos
parents:
5543
diff
changeset
|
92 s->cc = (s->cc + 1) & 0xf; |
3419 | 93 *q++ = 0x10 | s->cc; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
94 if (first) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
95 *q++ = 0; /* 0 offset */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
96 len1 = TS_PACKET_SIZE - (q - packet); |
885 | 97 if (len1 > len) |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
98 len1 = len; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
99 memcpy(q, buf_ptr, len1); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
100 q += len1; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
101 /* add known padding data */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
102 left = TS_PACKET_SIZE - (q - packet); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
103 if (left > 0) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
104 memset(q, 0xff, left); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
105 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
106 s->write_packet(s, packet); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
107 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
108 buf_ptr += len1; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
109 len -= len1; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
110 |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
111 ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
112 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
113 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
114 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
115 static inline void put16(uint8_t **q_ptr, int val) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
116 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
117 uint8_t *q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
118 q = *q_ptr; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
119 *q++ = val >> 8; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
120 *q++ = val; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
121 *q_ptr = q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
122 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
123 |
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
996
diff
changeset
|
124 static int mpegts_write_section1(MpegTSSection *s, int tid, int id, |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
125 int version, int sec_num, int last_sec_num, |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
126 uint8_t *buf, int len) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
127 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
128 uint8_t section[1024], *q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
129 unsigned int tot_len; |
885 | 130 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
131 tot_len = 3 + 5 + len + 4; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
132 /* check if not too big */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
133 if (tot_len > 1024) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
134 return -1; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
135 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
136 q = section; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
137 *q++ = tid; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
138 put16(&q, 0xb000 | (len + 5 + 4)); /* 5 byte header + 4 byte CRC */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
139 put16(&q, id); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
140 *q++ = 0xc1 | (version << 1); /* current_next_indicator = 1 */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
141 *q++ = sec_num; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
142 *q++ = last_sec_num; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
143 memcpy(q, buf, len); |
885 | 144 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
145 mpegts_write_section(s, section, tot_len); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
146 return 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
147 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
148 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
149 /*********************************************/ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
150 /* mpegts writer */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
151 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
152 #define DEFAULT_PMT_START_PID 0x1000 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
153 #define DEFAULT_START_PID 0x0100 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
154 #define DEFAULT_PROVIDER_NAME "FFmpeg" |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
155 #define DEFAULT_SERVICE_NAME "Service01" |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
156 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
157 /* default network id, transport stream and service identifiers */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
158 #define DEFAULT_ONID 0x0001 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
159 #define DEFAULT_TSID 0x0001 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
160 #define DEFAULT_SID 0x0001 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
161 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
162 /* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
163 #define DEFAULT_PES_HEADER_FREQ 16 |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
164 #define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170) |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
165 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
166 /* we retransmit the SI info at this rate */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
167 #define SDT_RETRANS_TIME 500 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
168 #define PAT_RETRANS_TIME 100 |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
169 #define PCR_RETRANS_TIME 20 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
170 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
171 typedef struct MpegTSWriteStream { |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
172 struct MpegTSService *service; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
173 int pid; /* stream associated pid */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
174 int cc; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
175 int payload_index; |
4915 | 176 int first_pts_check; ///< first pts check needed |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
177 int64_t payload_pts; |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
178 int64_t payload_dts; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
179 uint8_t payload[DEFAULT_PES_PAYLOAD_SIZE]; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
180 } MpegTSWriteStream; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
181 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
182 static void mpegts_write_pat(AVFormatContext *s) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
183 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
184 MpegTSWrite *ts = s->priv_data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
185 MpegTSService *service; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
186 uint8_t data[1012], *q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
187 int i; |
885 | 188 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
189 q = data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
190 for(i = 0; i < ts->nb_services; i++) { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
191 service = ts->services[i]; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
192 put16(&q, service->sid); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
193 put16(&q, 0xe000 | service->pmt.pid); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
194 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
195 mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid, 0, 0, 0, |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
196 data, q - data); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
197 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
198 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
199 static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
200 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
201 // MpegTSWrite *ts = s->priv_data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
202 uint8_t data[1012], *q, *desc_length_ptr, *program_info_length_ptr; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
203 int val, stream_type, i; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
204 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
205 q = data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
206 put16(&q, 0xe000 | service->pcr_pid); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
207 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
208 program_info_length_ptr = q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
209 q += 2; /* patched after */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
210 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
211 /* put program info here */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
212 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
213 val = 0xf000 | (q - program_info_length_ptr - 2); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
214 program_info_length_ptr[0] = val >> 8; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
215 program_info_length_ptr[1] = val; |
885 | 216 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
217 for(i = 0; i < s->nb_streams; i++) { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
218 AVStream *st = s->streams[i]; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
219 MpegTSWriteStream *ts_st = st->priv_data; |
4525 | 220 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL,0); |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
785
diff
changeset
|
221 switch(st->codec->codec_id) { |
313
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
222 case CODEC_ID_MPEG1VIDEO: |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
223 case CODEC_ID_MPEG2VIDEO: |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
224 stream_type = STREAM_TYPE_VIDEO_MPEG2; |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
225 break; |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
226 case CODEC_ID_MPEG4: |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
227 stream_type = STREAM_TYPE_VIDEO_MPEG4; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
228 break; |
313
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
229 case CODEC_ID_H264: |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
230 stream_type = STREAM_TYPE_VIDEO_H264; |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
231 break; |
3716 | 232 case CODEC_ID_DIRAC: |
233 stream_type = STREAM_TYPE_VIDEO_DIRAC; | |
234 break; | |
313
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
235 case CODEC_ID_MP2: |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
236 case CODEC_ID_MP3: |
160
9bde37b1a5ce
try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents:
152
diff
changeset
|
237 stream_type = STREAM_TYPE_AUDIO_MPEG1; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
238 break; |
313
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
239 case CODEC_ID_AAC: |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
240 stream_type = STREAM_TYPE_AUDIO_AAC; |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
241 break; |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
242 case CODEC_ID_AC3: |
5543 | 243 stream_type = STREAM_TYPE_AUDIO_AC3; |
313
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
244 break; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
245 default: |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
246 stream_type = STREAM_TYPE_PRIVATE_DATA; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
247 break; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
248 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
249 *q++ = stream_type; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
250 put16(&q, 0xe000 | ts_st->pid); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
251 desc_length_ptr = q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
252 q += 2; /* patched after */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
253 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
254 /* write optional descriptors here */ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
785
diff
changeset
|
255 switch(st->codec->codec_type) { |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
256 case CODEC_TYPE_AUDIO: |
4525 | 257 if (lang && strlen(lang->value) == 3) { |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
258 *q++ = 0x0a; /* ISO 639 language descriptor */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
259 *q++ = 4; |
4525 | 260 *q++ = lang->value[0]; |
261 *q++ = lang->value[1]; | |
262 *q++ = lang->value[2]; | |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
263 *q++ = 0; /* undefined type */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
264 } |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
265 break; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
266 case CODEC_TYPE_SUBTITLE: |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
267 { |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
268 const char *language; |
4525 | 269 language = lang && strlen(lang->value)==3 ? lang->value : "eng"; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
270 *q++ = 0x59; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
271 *q++ = 8; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
272 *q++ = language[0]; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
273 *q++ = language[1]; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
274 *q++ = language[2]; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
275 *q++ = 0x10; /* normal subtitles (0x20 = if hearing pb) */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
276 put16(&q, 1); /* page id */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
277 put16(&q, 1); /* ancillary page id */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
278 } |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
279 break; |
3716 | 280 case CODEC_TYPE_VIDEO: |
281 if (stream_type == STREAM_TYPE_VIDEO_DIRAC) { | |
282 *q++ = 0x05; /*MPEG-2 registration descriptor*/ | |
283 *q++ = 4; | |
284 *q++ = 'd'; | |
285 *q++ = 'r'; | |
286 *q++ = 'a'; | |
287 *q++ = 'c'; | |
288 } | |
289 break; | |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
290 } |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
291 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
292 val = 0xf000 | (q - desc_length_ptr - 2); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
293 desc_length_ptr[0] = val >> 8; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
294 desc_length_ptr[1] = val; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
295 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
296 mpegts_write_section1(&service->pmt, PMT_TID, service->sid, 0, 0, 0, |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
297 data, q - data); |
885 | 298 } |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
299 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
300 /* NOTE: str == NULL is accepted for an empty string */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
301 static void putstr8(uint8_t **q_ptr, const char *str) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
302 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
303 uint8_t *q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
304 int len; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
305 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
306 q = *q_ptr; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
307 if (!str) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
308 len = 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
309 else |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
310 len = strlen(str); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
311 *q++ = len; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
312 memcpy(q, str, len); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
313 q += len; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
314 *q_ptr = q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
315 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
316 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
317 static void mpegts_write_sdt(AVFormatContext *s) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
318 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
319 MpegTSWrite *ts = s->priv_data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
320 MpegTSService *service; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
321 uint8_t data[1012], *q, *desc_list_len_ptr, *desc_len_ptr; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
322 int i, running_status, free_ca_mode, val; |
885 | 323 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
324 q = data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
325 put16(&q, ts->onid); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
326 *q++ = 0xff; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
327 for(i = 0; i < ts->nb_services; i++) { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
328 service = ts->services[i]; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
329 put16(&q, service->sid); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
330 *q++ = 0xfc | 0x00; /* currently no EIT info */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
331 desc_list_len_ptr = q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
332 q += 2; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
333 running_status = 4; /* running */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
334 free_ca_mode = 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
335 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
336 /* write only one descriptor for the service name and provider */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
337 *q++ = 0x48; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
338 desc_len_ptr = q; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
339 q++; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
340 *q++ = 0x01; /* digital television service */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
341 putstr8(&q, service->provider_name); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
342 putstr8(&q, service->name); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
343 desc_len_ptr[0] = q - desc_len_ptr - 1; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
344 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
345 /* fill descriptor length */ |
885 | 346 val = (running_status << 13) | (free_ca_mode << 12) | |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
347 (q - desc_list_len_ptr - 2); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
348 desc_list_len_ptr[0] = val >> 8; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
349 desc_list_len_ptr[1] = val; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
350 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
351 mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, 0, 0, 0, |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
352 data, q - data); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
353 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
354 |
885 | 355 static MpegTSService *mpegts_add_service(MpegTSWrite *ts, |
356 int sid, | |
357 const char *provider_name, | |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
358 const char *name) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
359 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
360 MpegTSService *service; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
361 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
362 service = av_mallocz(sizeof(MpegTSService)); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
363 if (!service) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
364 return NULL; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
365 service->pmt.pid = DEFAULT_PMT_START_PID + ts->nb_services - 1; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
366 service->sid = sid; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
367 service->provider_name = av_strdup(provider_name); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
368 service->name = av_strdup(name); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
369 service->pcr_pid = 0x1fff; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
370 dynarray_add(&ts->services, &ts->nb_services, service); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
371 return service; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
372 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
373 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
374 static void section_write_packet(MpegTSSection *s, const uint8_t *packet) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
375 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
376 AVFormatContext *ctx = s->opaque; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
377 put_buffer(ctx->pb, packet, TS_PACKET_SIZE); |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
378 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
379 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
380 static int mpegts_write_header(AVFormatContext *s) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
381 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
382 MpegTSWrite *ts = s->priv_data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
383 MpegTSWriteStream *ts_st; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
384 MpegTSService *service; |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
385 AVStream *st, *pcr_st = NULL; |
4525 | 386 AVMetadataTag *title; |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
387 int i; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
388 const char *service_name; |
885 | 389 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
390 ts->tsid = DEFAULT_TSID; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
391 ts->onid = DEFAULT_ONID; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
392 /* allocate a single DVB service */ |
4525 | 393 title = av_metadata_get(s->metadata, "title", NULL, 0); |
394 service_name = title ? title->value : DEFAULT_SERVICE_NAME; | |
885 | 395 service = mpegts_add_service(ts, DEFAULT_SID, |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
396 DEFAULT_PROVIDER_NAME, service_name); |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
397 service->pmt.write_packet = section_write_packet; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
398 service->pmt.opaque = s; |
5782 | 399 service->pmt.cc = 15; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
400 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
401 ts->pat.pid = PAT_PID; |
5709
bdcd3e540558
Correctly increment continuity_counter in PCR packets.
cehoyos
parents:
5543
diff
changeset
|
402 ts->pat.cc = 15; // Initialize at 15 so that it wraps and be equal to 0 for the first packet we write |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
403 ts->pat.write_packet = section_write_packet; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
404 ts->pat.opaque = s; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
405 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
406 ts->sdt.pid = SDT_PID; |
5709
bdcd3e540558
Correctly increment continuity_counter in PCR packets.
cehoyos
parents:
5543
diff
changeset
|
407 ts->sdt.cc = 15; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
408 ts->sdt.write_packet = section_write_packet; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
409 ts->sdt.opaque = s; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
410 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
411 /* assign pids to each stream */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
412 for(i = 0;i < s->nb_streams; i++) { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
413 st = s->streams[i]; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
414 ts_st = av_mallocz(sizeof(MpegTSWriteStream)); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
415 if (!ts_st) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
416 goto fail; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
417 st->priv_data = ts_st; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
418 ts_st->service = service; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
419 ts_st->pid = DEFAULT_START_PID + i; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
420 ts_st->payload_pts = AV_NOPTS_VALUE; |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
421 ts_st->payload_dts = AV_NOPTS_VALUE; |
4915 | 422 ts_st->first_pts_check = 1; |
5781 | 423 ts_st->cc = 15; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
424 /* update PCR pid by using the first video stream */ |
885 | 425 if (st->codec->codec_type == CODEC_TYPE_VIDEO && |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
426 service->pcr_pid == 0x1fff) { |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
427 service->pcr_pid = ts_st->pid; |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
428 pcr_st = st; |
5219
583eb737b1c4
fix pes overhead computation, patch by Niobos, niobos at dest-unreach dot be
bcoudurier
parents:
5115
diff
changeset
|
429 } |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
430 } |
885 | 431 |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
432 /* if no video stream, use the first stream as PCR */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
433 if (service->pcr_pid == 0x1fff && s->nb_streams > 0) { |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
434 pcr_st = s->streams[0]; |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
435 ts_st = pcr_st->priv_data; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
436 service->pcr_pid = ts_st->pid; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
437 } |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
438 |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
439 ts->mux_rate = s->mux_rate ? s->mux_rate : 1; |
4216
de2177071c01
calculate pat, pmt and sdt exact size and adjust total bitrate
bcoudurier
parents:
4215
diff
changeset
|
440 |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
441 if (ts->mux_rate > 1) { |
5535
dd79e1261e28
move pcr/sdt/pat period computation after ts->mux_rate is set, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5534
diff
changeset
|
442 service->pcr_packet_period = (ts->mux_rate * PCR_RETRANS_TIME) / |
dd79e1261e28
move pcr/sdt/pat period computation after ts->mux_rate is set, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5534
diff
changeset
|
443 (TS_PACKET_SIZE * 8 * 1000); |
dd79e1261e28
move pcr/sdt/pat period computation after ts->mux_rate is set, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5534
diff
changeset
|
444 ts->sdt_packet_period = (ts->mux_rate * SDT_RETRANS_TIME) / |
dd79e1261e28
move pcr/sdt/pat period computation after ts->mux_rate is set, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5534
diff
changeset
|
445 (TS_PACKET_SIZE * 8 * 1000); |
dd79e1261e28
move pcr/sdt/pat period computation after ts->mux_rate is set, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5534
diff
changeset
|
446 ts->pat_packet_period = (ts->mux_rate * PAT_RETRANS_TIME) / |
dd79e1261e28
move pcr/sdt/pat period computation after ts->mux_rate is set, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5534
diff
changeset
|
447 (TS_PACKET_SIZE * 8 * 1000); |
dd79e1261e28
move pcr/sdt/pat period computation after ts->mux_rate is set, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5534
diff
changeset
|
448 |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
449 ts->cur_pcr = av_rescale(s->max_delay, 90000, AV_TIME_BASE); |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
450 } else { |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
451 /* Arbitrary values, PAT/PMT could be written on key frames */ |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
452 ts->sdt_packet_period = 200; |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
453 ts->pat_packet_period = 40; |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
454 if (pcr_st->codec->codec_type == CODEC_TYPE_AUDIO) { |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
455 if (!pcr_st->codec->frame_size) { |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
456 av_log(s, AV_LOG_WARNING, "frame size not set\n"); |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
457 service->pcr_packet_period = |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
458 pcr_st->codec->sample_rate/(10*512); |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
459 } else { |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
460 service->pcr_packet_period = |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
461 pcr_st->codec->sample_rate/(10*pcr_st->codec->frame_size); |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
462 } |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
463 } else { |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
464 // max delta PCR 0.1s |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
465 service->pcr_packet_period = |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
466 pcr_st->codec->time_base.den/(10*pcr_st->codec->time_base.num); |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
467 } |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
468 } |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
469 |
5534
2836866dd7a1
output a pcr as soon as possible, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5533
diff
changeset
|
470 // output a PCR as soon as possible |
2836866dd7a1
output a pcr as soon as possible, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5533
diff
changeset
|
471 service->pcr_packet_count = service->pcr_packet_period; |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
472 ts->pat_packet_count = ts->pat_packet_period-1; |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
473 ts->sdt_packet_count = ts->sdt_packet_period-1; |
5534
2836866dd7a1
output a pcr as soon as possible, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5533
diff
changeset
|
474 |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
475 av_log(s, AV_LOG_INFO, |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
476 "muxrate %d bps, pcr every %d pkts, " |
5538
3ad37f4daa76
print more debug info about muxing parameters, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5537
diff
changeset
|
477 "sdt every %d, pat/pmt every %d pkts\n", |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
478 ts->mux_rate, service->pcr_packet_period, |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
479 ts->sdt_packet_period, ts->pat_packet_period); |
5538
3ad37f4daa76
print more debug info about muxing parameters, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5537
diff
changeset
|
480 |
4216
de2177071c01
calculate pat, pmt and sdt exact size and adjust total bitrate
bcoudurier
parents:
4215
diff
changeset
|
481 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
482 put_flush_packet(s->pb); |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
483 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
484 return 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
485 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
486 fail: |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
487 for(i = 0;i < s->nb_streams; i++) { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
488 st = s->streams[i]; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
489 av_free(st->priv_data); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
490 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
491 return -1; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
492 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
493 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
494 /* send SDT, PAT and PMT tables regulary */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
495 static void retransmit_si_info(AVFormatContext *s) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
496 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
497 MpegTSWrite *ts = s->priv_data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
498 int i; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
499 |
5115
640c875b3bfe
rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents:
4952
diff
changeset
|
500 if (++ts->sdt_packet_count == ts->sdt_packet_period) { |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
501 ts->sdt_packet_count = 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
502 mpegts_write_sdt(s); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
503 } |
5115
640c875b3bfe
rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents:
4952
diff
changeset
|
504 if (++ts->pat_packet_count == ts->pat_packet_period) { |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
505 ts->pat_packet_count = 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
506 mpegts_write_pat(s); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
507 for(i = 0; i < ts->nb_services; i++) { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
508 mpegts_write_pmt(s, ts->services[i]); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
509 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
510 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
511 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
512 |
5536
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
513 /* Write a single null transport stream packet */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
514 static void mpegts_insert_null_packet(AVFormatContext *s) |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
515 { |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
516 MpegTSWrite *ts = s->priv_data; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
517 uint8_t *q; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
518 uint8_t buf[TS_PACKET_SIZE]; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
519 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
520 q = buf; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
521 *q++ = 0x47; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
522 *q++ = 0x00 | 0x1f; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
523 *q++ = 0xff; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
524 *q++ = 0x10; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
525 memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf)); |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
526 put_buffer(s->pb, buf, TS_PACKET_SIZE); |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
527 ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
528 } |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
529 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
530 /* Write a single transport stream packet with a PCR and no payload */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
531 static void mpegts_insert_pcr_only(AVFormatContext *s, AVStream *st) |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
532 { |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
533 MpegTSWrite *ts = s->priv_data; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
534 MpegTSWriteStream *ts_st = st->priv_data; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
535 uint8_t *q; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
536 uint64_t pcr = ts->cur_pcr; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
537 uint8_t buf[TS_PACKET_SIZE]; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
538 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
539 q = buf; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
540 *q++ = 0x47; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
541 *q++ = ts_st->pid >> 8; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
542 *q++ = ts_st->pid; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
543 *q++ = 0x20 | ts_st->cc; /* Adaptation only */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
544 /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
545 *q++ = TS_PACKET_SIZE - 5; /* Adaptation Field Length */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
546 *q++ = 0x10; /* Adaptation flags: PCR present */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
547 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
548 /* PCR coded into 6 bytes */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
549 *q++ = pcr >> 25; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
550 *q++ = pcr >> 17; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
551 *q++ = pcr >> 9; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
552 *q++ = pcr >> 1; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
553 *q++ = (pcr & 1) << 7; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
554 *q++ = 0; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
555 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
556 /* stuffing bytes */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
557 memset(q, 0xFF, TS_PACKET_SIZE - (q - buf)); |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
558 put_buffer(s->pb, buf, TS_PACKET_SIZE); |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
559 ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
560 } |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
561 |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
562 static void write_pts(uint8_t *q, int fourbits, int64_t pts) |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
563 { |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
564 int val; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
565 |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
566 val = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
567 *q++ = val; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
568 val = (((pts >> 15) & 0x7fff) << 1) | 1; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
569 *q++ = val >> 8; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
570 *q++ = val; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
571 val = (((pts) & 0x7fff) << 1) | 1; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
572 *q++ = val >> 8; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
573 *q++ = val; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
574 } |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
575 |
5537
8b4ac40f9525
update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5536
diff
changeset
|
576 /* Add a pes header to the front of payload, and segment into an integer number of |
8b4ac40f9525
update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5536
diff
changeset
|
577 * ts packets. The final ts packet is padded using an over-sized adaptation header |
8b4ac40f9525
update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5536
diff
changeset
|
578 * to exactly fill the last ts packet. |
8b4ac40f9525
update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5536
diff
changeset
|
579 * NOTE: 'payload' contains a complete PES payload. |
8b4ac40f9525
update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5536
diff
changeset
|
580 */ |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
581 static void mpegts_write_pes(AVFormatContext *s, AVStream *st, |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
582 const uint8_t *payload, int payload_size, |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
583 int64_t pts, int64_t dts) |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
584 { |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
585 MpegTSWriteStream *ts_st = st->priv_data; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
586 MpegTSWrite *ts = s->priv_data; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
587 uint8_t buf[TS_PACKET_SIZE]; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
588 uint8_t *q; |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
589 int val, is_start, len, header_len, write_pcr, private_code, flags; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
590 int afc_len, stuffing_len; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
591 int64_t pcr = -1; /* avoid warning */ |
5536
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
592 int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE); |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
593 |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
594 is_start = 1; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
595 while (payload_size > 0) { |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
596 retransmit_si_info(s); |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
597 |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
598 write_pcr = 0; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
599 if (ts_st->pid == ts_st->service->pcr_pid) { |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
600 if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
601 ts_st->service->pcr_packet_count++; |
885 | 602 if (ts_st->service->pcr_packet_count >= |
5115
640c875b3bfe
rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents:
4952
diff
changeset
|
603 ts_st->service->pcr_packet_period) { |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
604 ts_st->service->pcr_packet_count = 0; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
605 write_pcr = 1; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
606 } |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
607 } |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
608 |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
609 if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE && |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
610 (dts - (int64_t)ts->cur_pcr) > delay) { |
5536
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
611 /* pcr insert gets priority over null packet insert */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
612 if (write_pcr) |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
613 mpegts_insert_pcr_only(s, st); |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
614 else |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
615 mpegts_insert_null_packet(s); |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
616 continue; /* recalculate write_pcr and possibly retransmit si_info */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
617 } |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
618 |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
619 /* prepare packet header */ |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
620 q = buf; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
621 *q++ = 0x47; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
622 val = (ts_st->pid >> 8); |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
623 if (is_start) |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
624 val |= 0x40; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
625 *q++ = val; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
626 *q++ = ts_st->pid; |
5709
bdcd3e540558
Correctly increment continuity_counter in PCR packets.
cehoyos
parents:
5543
diff
changeset
|
627 ts_st->cc = (ts_st->cc + 1) & 0xf; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
628 *q++ = 0x10 | ts_st->cc | (write_pcr ? 0x20 : 0); |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
629 if (write_pcr) { |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
630 // add 11, pcr references the last byte of program clock reference base |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
631 if (ts->mux_rate > 1) |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
632 pcr = ts->cur_pcr + (4+7)*8*90000LL / ts->mux_rate; |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
633 else |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
634 pcr = dts - delay; |
4214 | 635 if (dts != AV_NOPTS_VALUE && dts < pcr) |
636 av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n"); | |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
637 *q++ = 7; /* AFC length */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
638 *q++ = 0x10; /* flags: PCR present */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
639 *q++ = pcr >> 25; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
640 *q++ = pcr >> 17; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
641 *q++ = pcr >> 9; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
642 *q++ = pcr >> 1; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
643 *q++ = (pcr & 1) << 7; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
644 *q++ = 0; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
645 } |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
646 if (is_start) { |
3716 | 647 int pes_extension = 0; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
648 /* write PES header */ |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
649 *q++ = 0x00; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
650 *q++ = 0x00; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
651 *q++ = 0x01; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
652 private_code = 0; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
785
diff
changeset
|
653 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
3716 | 654 if (st->codec->codec_id == CODEC_ID_DIRAC) { |
655 *q++ = 0xfd; | |
656 } else | |
657 *q++ = 0xe0; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
785
diff
changeset
|
658 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO && |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
785
diff
changeset
|
659 (st->codec->codec_id == CODEC_ID_MP2 || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
785
diff
changeset
|
660 st->codec->codec_id == CODEC_ID_MP3)) { |
885 | 661 *q++ = 0xc0; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
662 } else { |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
663 *q++ = 0xbd; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
785
diff
changeset
|
664 if (st->codec->codec_type == CODEC_TYPE_SUBTITLE) { |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
665 private_code = 0x20; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
666 } |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
667 } |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
668 header_len = 0; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
669 flags = 0; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
670 if (pts != AV_NOPTS_VALUE) { |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
671 header_len += 5; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
672 flags |= 0x80; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
673 } |
4913 | 674 if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) { |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
675 header_len += 5; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
676 flags |= 0x40; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
677 } |
3716 | 678 if (st->codec->codec_type == CODEC_TYPE_VIDEO && |
679 st->codec->codec_id == CODEC_ID_DIRAC) { | |
680 /* set PES_extension_flag */ | |
681 pes_extension = 1; | |
682 flags |= 0x01; | |
683 | |
684 /* | |
685 * One byte for PES2 extension flag + | |
686 * one byte for extension length + | |
687 * one byte for extension id | |
688 */ | |
689 header_len += 3; | |
690 } | |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
691 len = payload_size + header_len + 3; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
692 if (private_code != 0) |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
693 len++; |
4921
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
694 if (len > 0xffff) |
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
695 len = 0; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
696 *q++ = len >> 8; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
697 *q++ = len; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
698 val = 0x80; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
699 /* data alignment indicator is required for subtitle data */ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
785
diff
changeset
|
700 if (st->codec->codec_type == CODEC_TYPE_SUBTITLE) |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
701 val |= 0x04; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
702 *q++ = val; |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
703 *q++ = flags; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
704 *q++ = header_len; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
705 if (pts != AV_NOPTS_VALUE) { |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
706 write_pts(q, flags >> 6, pts); |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
707 q += 5; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
708 } |
4913 | 709 if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) { |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
710 write_pts(q, 1, dts); |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
711 q += 5; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
712 } |
3716 | 713 if (pes_extension && st->codec->codec_id == CODEC_ID_DIRAC) { |
714 flags = 0x01; /* set PES_extension_flag_2 */ | |
715 *q++ = flags; | |
716 *q++ = 0x80 | 0x01; /* marker bit + extension length */ | |
717 /* | |
718 * Set the stream id extension flag bit to 0 and | |
719 * write the extended stream id | |
720 */ | |
721 *q++ = 0x00 | 0x60; | |
722 } | |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
723 if (private_code != 0) |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
724 *q++ = private_code; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
725 is_start = 0; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
726 } |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
727 /* header size */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
728 header_len = q - buf; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
729 /* data len */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
730 len = TS_PACKET_SIZE - header_len; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
731 if (len > payload_size) |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
732 len = payload_size; |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
733 stuffing_len = TS_PACKET_SIZE - header_len - len; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
734 if (stuffing_len > 0) { |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
735 /* add stuffing with AFC */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
736 if (buf[3] & 0x20) { |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
737 /* stuffing already present: increase its size */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
738 afc_len = buf[4] + 1; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
739 memmove(buf + 4 + afc_len + stuffing_len, |
885 | 740 buf + 4 + afc_len, |
785
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
741 header_len - (4 + afc_len)); |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
742 buf[4] += stuffing_len; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
743 memset(buf + 4 + afc_len, 0xff, stuffing_len); |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
744 } else { |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
745 /* add stuffing */ |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
746 memmove(buf + 4 + stuffing_len, buf + 4, header_len - 4); |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
747 buf[3] |= 0x20; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
748 buf[4] = stuffing_len - 1; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
749 if (stuffing_len >= 2) { |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
750 buf[5] = 0x00; |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
751 memset(buf + 6, 0xff, stuffing_len - 2); |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
752 } |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
753 } |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
754 } |
e277d8928f49
buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents:
693
diff
changeset
|
755 memcpy(buf + TS_PACKET_SIZE - len, payload, len); |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
756 payload += len; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
757 payload_size -= len; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
758 put_buffer(s->pb, buf, TS_PACKET_SIZE); |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
759 ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
760 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
761 put_flush_packet(s->pb); |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
762 } |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
763 |
468 | 764 static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
765 { |
468 | 766 AVStream *st = s->streams[pkt->stream_index]; |
5539 | 767 int size = pkt->size; |
468 | 768 uint8_t *buf= pkt->data; |
4219
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
769 uint8_t *data= NULL; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
770 MpegTSWriteStream *ts_st = st->priv_data; |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
771 const uint64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE)*2; |
4220 | 772 int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE; |
773 | |
774 if (pkt->pts != AV_NOPTS_VALUE) | |
775 pts = pkt->pts + delay; | |
776 if (pkt->dts != AV_NOPTS_VALUE) | |
777 dts = pkt->dts + delay; | |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
778 |
4915 | 779 if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) { |
780 av_log(s, AV_LOG_ERROR, "first pts value must set\n"); | |
781 return -1; | |
782 } | |
783 ts_st->first_pts_check = 0; | |
784 | |
4921
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
785 if (st->codec->codec_id == CODEC_ID_H264) { |
5786
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
786 const uint8_t *p = buf, *buf_end = p+size; |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
787 uint32_t state = -1; |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
788 |
4219
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
789 if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) { |
5786
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
790 av_log(s, AV_LOG_ERROR, "h264 bitstream malformated, " |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
791 "no startcode found, use -vbsf h264_mp4toannexb\n"); |
4219
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
792 return -1; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
793 } |
5786
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
794 |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
795 do { |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
796 p = ff_find_start_code(p, buf_end, &state); |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
797 //av_log(s, AV_LOG_INFO, "nal %d\n", state & 0x1f); |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
798 } while (p < buf_end && (state & 0x1f) != 9 && |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
799 (state & 0x1f) != 5 && (state & 0x1f) != 1); |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
800 |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
801 if ((state & 0x1f) != 9) { // AUD NAL |
4219
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
802 data = av_malloc(pkt->size+6); |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
803 if (!data) |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
804 return -1; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
805 memcpy(data+6, pkt->data, pkt->size); |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
806 AV_WB32(data, 0x00000001); |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
807 data[4] = 0x09; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
808 data[5] = 0xe0; // any slice type |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
809 buf = data; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
810 size = pkt->size+6; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
811 } |
4211
5e5654752973
set pts and dts of pes packets exactly according to specs
bcoudurier
parents:
4209
diff
changeset
|
812 } |
5e5654752973
set pts and dts of pes packets exactly according to specs
bcoudurier
parents:
4209
diff
changeset
|
813 |
5306
95a0faec0218
mux all stream types except audio as one pes packet per avpacket, issue #1374
bcoudurier
parents:
5219
diff
changeset
|
814 if (st->codec->codec_type != CODEC_TYPE_AUDIO) { |
4921
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
815 // for video and subtitle, write a single pes packet |
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
816 mpegts_write_pes(s, st, buf, size, pts, dts); |
4922 | 817 av_free(data); |
4921
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
818 return 0; |
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
819 } |
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
820 |
5539 | 821 if (ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) { |
822 mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index, | |
823 ts_st->payload_pts, ts_st->payload_dts); | |
824 ts_st->payload_index = 0; | |
4952
0be83fd54e7a
simplify pes timestamps fetching, based on a patch by corp186, chasedouglas at gmail dot com
bcoudurier
parents:
4951
diff
changeset
|
825 } |
0be83fd54e7a
simplify pes timestamps fetching, based on a patch by corp186, chasedouglas at gmail dot com
bcoudurier
parents:
4951
diff
changeset
|
826 |
5539 | 827 if (!ts_st->payload_index) { |
828 ts_st->payload_pts = pts; | |
829 ts_st->payload_dts = dts; | |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
830 } |
4219
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
831 |
5539 | 832 memcpy(ts_st->payload + ts_st->payload_index, buf, size); |
833 ts_st->payload_index += size; | |
834 | |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
835 return 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
836 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
837 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
838 static int mpegts_write_end(AVFormatContext *s) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
839 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
840 MpegTSWrite *ts = s->priv_data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
841 MpegTSWriteStream *ts_st; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
842 MpegTSService *service; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
843 AVStream *st; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
844 int i; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
845 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
846 /* flush current packets */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
847 for(i = 0; i < s->nb_streams; i++) { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
848 st = s->streams[i]; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
849 ts_st = st->priv_data; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
850 if (ts_st->payload_index > 0) { |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
851 mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index, |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
852 ts_st->payload_pts, ts_st->payload_dts); |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
853 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
854 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
855 put_flush_packet(s->pb); |
885 | 856 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
857 for(i = 0; i < ts->nb_services; i++) { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
858 service = ts->services[i]; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
859 av_freep(&service->provider_name); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
860 av_freep(&service->name); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
861 av_free(service); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
862 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
863 av_free(ts->services); |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
864 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
865 return 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
866 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
867 |
1167 | 868 AVOutputFormat mpegts_muxer = { |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
869 "mpegts", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3420
diff
changeset
|
870 NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"), |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
871 "video/x-mpegts", |
3420 | 872 "ts,m2t", |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
873 sizeof(MpegTSWrite), |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
874 CODEC_ID_MP2, |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
875 CODEC_ID_MPEG2VIDEO, |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
876 mpegts_write_header, |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
877 mpegts_write_packet, |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
878 mpegts_write_end, |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
879 }; |