Mercurial > libavformat.hg
annotate mpegtsenc.c @ 5984:55c714a8fb00 libavformat
Make the IFF demuxer a little more standards-compliant, e.g. respect the size
fields of common media header chunks (these can have different sizes depending
on the type of IFF file you read), better handle odd sizes (like RIFF, every
field is padded to word) and handle headerchunks after the BODY chunk.
Patch by Sebastian Vater <cdgs.basty googlemail com>.
author | rbultje |
---|---|
date | Tue, 27 Apr 2010 14:03:47 +0000 |
parents | 28ca2d77f997 |
children | ac9ea0fde990 |
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" |
5946
28ca2d77f997
Move the internal function declarations in avformat.h to internal.h.
stefano
parents:
5930
diff
changeset
|
26 #include "internal.h" |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
27 #include "mpegts.h" |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
28 #include "adts.h" |
152
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 /* 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
|
31 |
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 /* 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
|
34 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
35 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
|
36 int pid; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
37 int cc; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
38 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
|
39 void *opaque; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
40 } MpegTSSection; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
41 |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
42 typedef struct MpegTSService { |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
43 MpegTSSection pmt; /* MPEG2 pmt table context */ |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
44 int sid; /* service ID */ |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
45 char *name; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
46 char *provider_name; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
47 int pcr_pid; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
48 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
|
49 int pcr_packet_period; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
50 } MpegTSService; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
51 |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
52 typedef struct MpegTSWrite { |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
53 MpegTSSection pat; /* MPEG2 pat table */ |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
54 MpegTSSection sdt; /* MPEG2 sdt table context */ |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
55 MpegTSService **services; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
56 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
|
57 int sdt_packet_period; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
58 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
|
59 int pat_packet_period; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
60 int nb_services; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
61 int onid; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
62 int tsid; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
63 uint64_t cur_pcr; |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
64 int mux_rate; ///< set to 1 when VBR |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
65 } MpegTSWrite; |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
66 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
67 /* 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
|
68 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
|
69 { |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
70 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
|
71 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
|
72 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
|
73 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
|
74 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
|
75 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
|
76 |
2893 | 77 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
|
78 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
|
79 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
|
80 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
|
81 buf[len - 1] = (crc) & 0xff; |
885 | 82 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
83 /* 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
|
84 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
|
85 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
|
86 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
|
87 q = packet; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
88 *q++ = 0x47; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
89 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
|
90 if (first) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
91 b |= 0x40; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
92 *q++ = b; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
93 *q++ = s->pid; |
5709
bdcd3e540558
Correctly increment continuity_counter in PCR packets.
cehoyos
parents:
5543
diff
changeset
|
94 s->cc = (s->cc + 1) & 0xf; |
3419 | 95 *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
|
96 if (first) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
97 *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
|
98 len1 = TS_PACKET_SIZE - (q - packet); |
885 | 99 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
|
100 len1 = len; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
101 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
|
102 q += len1; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
103 /* 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
|
104 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
|
105 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
|
106 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
|
107 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
108 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
|
109 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
110 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
|
111 len -= len1; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
112 |
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
113 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
|
114 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
115 } |
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 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
|
118 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
119 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
|
120 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
|
121 *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
|
122 *q++ = val; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
123 *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
|
124 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
125 |
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
996
diff
changeset
|
126 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
|
127 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
|
128 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
|
129 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
130 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
|
131 unsigned int tot_len; |
885 | 132 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
133 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
|
134 /* 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
|
135 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
|
136 return -1; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
137 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
138 q = section; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
139 *q++ = tid; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
140 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
|
141 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
|
142 *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
|
143 *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
|
144 *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
|
145 memcpy(q, buf, len); |
885 | 146 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
147 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
|
148 return 0; |
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 |
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 /* mpegts writer */ |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
153 |
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_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
|
155 #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
|
156 #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
|
157 #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
|
158 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
159 /* 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
|
160 #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
|
161 #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
|
162 #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
|
163 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
164 /* 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
|
165 #define DEFAULT_PES_HEADER_FREQ 16 |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
166 #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
|
167 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
168 /* 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
|
169 #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
|
170 #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
|
171 #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
|
172 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
173 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
|
174 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
|
175 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
|
176 int cc; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
177 int payload_index; |
4915 | 178 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
|
179 int64_t payload_pts; |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
180 int64_t payload_dts; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
181 uint8_t payload[DEFAULT_PES_PAYLOAD_SIZE]; |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
182 ADTSContext *adts; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
183 } MpegTSWriteStream; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
184 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
185 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
|
186 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
187 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
|
188 MpegTSService *service; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
189 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
|
190 int i; |
885 | 191 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
192 q = data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
193 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
|
194 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
|
195 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
|
196 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
|
197 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
198 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
|
199 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
|
200 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
201 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
202 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
|
203 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
204 // 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
|
205 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
|
206 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
|
207 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
208 q = data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
209 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
|
210 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
211 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
|
212 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
|
213 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
214 /* 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
|
215 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
216 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
|
217 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
|
218 program_info_length_ptr[1] = val; |
885 | 219 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
220 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
|
221 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
|
222 MpegTSWriteStream *ts_st = st->priv_data; |
4525 | 223 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
|
224 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
|
225 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
|
226 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
|
227 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
|
228 break; |
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_MPEG4: |
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_MPEG4; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
231 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
|
232 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
|
233 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
|
234 break; |
3716 | 235 case CODEC_ID_DIRAC: |
236 stream_type = STREAM_TYPE_VIDEO_DIRAC; | |
237 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
|
238 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
|
239 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
|
240 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
|
241 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
|
242 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
|
243 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
|
244 break; |
622892a75ddb
support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents:
250
diff
changeset
|
245 case CODEC_ID_AC3: |
5543 | 246 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
|
247 break; |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
248 default: |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
249 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
|
250 break; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
251 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
252 *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
|
253 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
|
254 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
|
255 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
|
256 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
257 /* 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
|
258 switch(st->codec->codec_type) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
259 case AVMEDIA_TYPE_AUDIO: |
4525 | 260 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
|
261 *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
|
262 *q++ = 4; |
4525 | 263 *q++ = lang->value[0]; |
264 *q++ = lang->value[1]; | |
265 *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
|
266 *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
|
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 break; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
269 case AVMEDIA_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
|
270 { |
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 const char *language; |
4525 | 272 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
|
273 *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
|
274 *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
|
275 *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
|
276 *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
|
277 *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
|
278 *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
|
279 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
|
280 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
|
281 } |
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
|
282 break; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
283 case AVMEDIA_TYPE_VIDEO: |
3716 | 284 if (stream_type == STREAM_TYPE_VIDEO_DIRAC) { |
285 *q++ = 0x05; /*MPEG-2 registration descriptor*/ | |
286 *q++ = 4; | |
287 *q++ = 'd'; | |
288 *q++ = 'r'; | |
289 *q++ = 'a'; | |
290 *q++ = 'c'; | |
291 } | |
292 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
|
293 } |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
294 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
295 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
|
296 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
|
297 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
|
298 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
299 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
|
300 data, q - data); |
885 | 301 } |
152
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 /* 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
|
304 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
|
305 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
306 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
|
307 int len; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
308 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
309 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
|
310 if (!str) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
311 len = 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
312 else |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
313 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
|
314 *q++ = len; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
315 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
|
316 q += len; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
317 *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
|
318 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
319 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
320 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
|
321 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
322 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
|
323 MpegTSService *service; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
324 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
|
325 int i, running_status, free_ca_mode, val; |
885 | 326 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
327 q = data; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
328 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
|
329 *q++ = 0xff; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
330 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
|
331 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
|
332 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
|
333 *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
|
334 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
|
335 q += 2; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
336 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
|
337 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
|
338 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
339 /* 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
|
340 *q++ = 0x48; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
341 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
|
342 q++; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
343 *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
|
344 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
|
345 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
|
346 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
|
347 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
348 /* fill descriptor length */ |
885 | 349 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
|
350 (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
|
351 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
|
352 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
|
353 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
354 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
|
355 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
|
356 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
357 |
885 | 358 static MpegTSService *mpegts_add_service(MpegTSWrite *ts, |
359 int sid, | |
360 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
|
361 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
|
362 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
363 MpegTSService *service; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
364 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
365 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
|
366 if (!service) |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
367 return NULL; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
368 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
|
369 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
|
370 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
|
371 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
|
372 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
|
373 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
|
374 return service; |
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 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
377 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
|
378 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
379 AVFormatContext *ctx = s->opaque; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
380 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
|
381 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
382 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
383 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
|
384 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
385 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
|
386 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
|
387 MpegTSService *service; |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
388 AVStream *st, *pcr_st = NULL; |
4525 | 389 AVMetadataTag *title; |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
390 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
|
391 const char *service_name; |
885 | 392 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
393 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
|
394 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
|
395 /* allocate a single DVB service */ |
4525 | 396 title = av_metadata_get(s->metadata, "title", NULL, 0); |
397 service_name = title ? title->value : DEFAULT_SERVICE_NAME; | |
885 | 398 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
|
399 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
|
400 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
|
401 service->pmt.opaque = s; |
5782 | 402 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
|
403 |
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.pid = PAT_PID; |
5709
bdcd3e540558
Correctly increment continuity_counter in PCR packets.
cehoyos
parents:
5543
diff
changeset
|
405 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
|
406 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
|
407 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
|
408 |
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.pid = SDT_PID; |
5709
bdcd3e540558
Correctly increment continuity_counter in PCR packets.
cehoyos
parents:
5543
diff
changeset
|
410 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
|
411 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
|
412 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
|
413 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
414 /* 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
|
415 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
|
416 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
|
417 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
|
418 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
|
419 goto fail; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
420 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
|
421 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
|
422 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
|
423 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
|
424 ts_st->payload_dts = AV_NOPTS_VALUE; |
4915 | 425 ts_st->first_pts_check = 1; |
5781 | 426 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
|
427 /* update PCR pid by using the first video stream */ |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
428 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
429 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
|
430 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
|
431 pcr_st = st; |
5219
583eb737b1c4
fix pes overhead computation, patch by Niobos, niobos at dest-unreach dot be
bcoudurier
parents:
5115
diff
changeset
|
432 } |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
433 if (st->codec->codec_id == CODEC_ID_AAC && |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
434 st->codec->extradata_size > 0) { |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
435 ts_st->adts = av_mallocz(sizeof(*ts_st->adts)); |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
436 if (!ts_st->adts) |
5930
08cd1179a20d
Replace all remaining occurrences of AVERROR_NOMEM with
stefano
parents:
5910
diff
changeset
|
437 return AVERROR(ENOMEM); |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
438 if (ff_adts_decode_extradata(s, ts_st->adts, st->codec->extradata, |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
439 st->codec->extradata_size) < 0) |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
440 return -1; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
441 } |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
442 } |
885 | 443 |
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
|
444 /* 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
|
445 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
|
446 pcr_st = s->streams[0]; |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
447 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
|
448 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
|
449 } |
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
|
450 |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
451 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
|
452 |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
453 if (ts->mux_rate > 1) { |
5803 | 454 service->pcr_packet_period = (ts->mux_rate * PCR_RETRANS_TIME) / |
455 (TS_PACKET_SIZE * 8 * 1000); | |
456 ts->sdt_packet_period = (ts->mux_rate * SDT_RETRANS_TIME) / | |
457 (TS_PACKET_SIZE * 8 * 1000); | |
458 ts->pat_packet_period = (ts->mux_rate * PAT_RETRANS_TIME) / | |
459 (TS_PACKET_SIZE * 8 * 1000); | |
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
|
460 |
5803 | 461 ts->cur_pcr = av_rescale(s->max_delay, 90000, AV_TIME_BASE); |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
462 } else { |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
463 /* 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
|
464 ts->sdt_packet_period = 200; |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
465 ts->pat_packet_period = 40; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
466 if (pcr_st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
467 if (!pcr_st->codec->frame_size) { |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
468 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
|
469 service->pcr_packet_period = |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
470 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
|
471 } else { |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
472 service->pcr_packet_period = |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
473 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
|
474 } |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
475 } else { |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
476 // max delta PCR 0.1s |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
477 service->pcr_packet_period = |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
478 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
|
479 } |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
480 } |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
481 |
5534
2836866dd7a1
output a pcr as soon as possible, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5533
diff
changeset
|
482 // 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
|
483 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
|
484 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
|
485 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
|
486 |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
487 av_log(s, AV_LOG_INFO, |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
488 "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
|
489 "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
|
490 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
|
491 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
|
492 |
4216
de2177071c01
calculate pat, pmt and sdt exact size and adjust total bitrate
bcoudurier
parents:
4215
diff
changeset
|
493 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
494 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
|
495 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
496 return 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
497 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
498 fail: |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
499 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
|
500 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
|
501 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
|
502 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
503 return -1; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
504 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
505 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
506 /* 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
|
507 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
|
508 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
509 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
|
510 int i; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
511 |
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
|
512 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
|
513 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
|
514 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
|
515 } |
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
|
516 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
|
517 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
|
518 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
|
519 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
|
520 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
|
521 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
522 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
523 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
524 |
5536
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
525 /* 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
|
526 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
|
527 { |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
528 MpegTSWrite *ts = s->priv_data; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
529 uint8_t *q; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
530 uint8_t buf[TS_PACKET_SIZE]; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
531 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
532 q = buf; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
533 *q++ = 0x47; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
534 *q++ = 0x00 | 0x1f; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
535 *q++ = 0xff; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
536 *q++ = 0x10; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
537 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
|
538 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
|
539 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
|
540 } |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
541 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
542 /* 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
|
543 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
|
544 { |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
545 MpegTSWrite *ts = s->priv_data; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
546 MpegTSWriteStream *ts_st = st->priv_data; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
547 uint8_t *q; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
548 uint64_t pcr = ts->cur_pcr; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
549 uint8_t buf[TS_PACKET_SIZE]; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
550 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
551 q = buf; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
552 *q++ = 0x47; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
553 *q++ = ts_st->pid >> 8; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
554 *q++ = ts_st->pid; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
555 *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
|
556 /* 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
|
557 *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
|
558 *q++ = 0x10; /* Adaptation flags: PCR present */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
559 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
560 /* PCR coded into 6 bytes */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
561 *q++ = pcr >> 25; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
562 *q++ = pcr >> 17; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
563 *q++ = pcr >> 9; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
564 *q++ = pcr >> 1; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
565 *q++ = (pcr & 1) << 7; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
566 *q++ = 0; |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
567 |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
568 /* stuffing bytes */ |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
569 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
|
570 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
|
571 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
|
572 } |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
573 |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
574 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
|
575 { |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
576 int val; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
577 |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
578 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
|
579 *q++ = val; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
580 val = (((pts >> 15) & 0x7fff) << 1) | 1; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
581 *q++ = val >> 8; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
582 *q++ = val; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
583 val = (((pts) & 0x7fff) << 1) | 1; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
584 *q++ = val >> 8; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
585 *q++ = val; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
586 } |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
587 |
5537
8b4ac40f9525
update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents:
5536
diff
changeset
|
588 /* 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
|
589 * 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
|
590 * 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
|
591 * 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
|
592 */ |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
593 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
|
594 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
|
595 int64_t pts, int64_t dts) |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
596 { |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
597 MpegTSWriteStream *ts_st = st->priv_data; |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
598 MpegTSWrite *ts = s->priv_data; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
599 uint8_t buf[TS_PACKET_SIZE]; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
600 uint8_t *q; |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
601 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
|
602 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
|
603 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
|
604 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
|
605 |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
606 is_start = 1; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
607 while (payload_size > 0) { |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
608 retransmit_si_info(s); |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
609 |
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
|
610 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
|
611 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
|
612 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
|
613 ts_st->service->pcr_packet_count++; |
885 | 614 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
|
615 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
|
616 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
|
617 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
|
618 } |
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
|
619 } |
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
|
620 |
5784
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
621 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
|
622 (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
|
623 /* 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
|
624 if (write_pcr) |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
625 mpegts_insert_pcr_only(s, st); |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
626 else |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
627 mpegts_insert_null_packet(s); |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
628 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
|
629 } |
c13224897684
Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents:
5535
diff
changeset
|
630 |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
631 /* prepare packet header */ |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
632 q = buf; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
633 *q++ = 0x47; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
634 val = (ts_st->pid >> 8); |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
635 if (is_start) |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
636 val |= 0x40; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
637 *q++ = val; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
638 *q++ = ts_st->pid; |
5709
bdcd3e540558
Correctly increment continuity_counter in PCR packets.
cehoyos
parents:
5543
diff
changeset
|
639 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
|
640 *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
|
641 if (write_pcr) { |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
642 // 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
|
643 if (ts->mux_rate > 1) |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
644 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
|
645 else |
28885ab1ef1c
mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents:
5782
diff
changeset
|
646 pcr = dts - delay; |
4214 | 647 if (dts != AV_NOPTS_VALUE && dts < pcr) |
648 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
|
649 *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
|
650 *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
|
651 *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
|
652 *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
|
653 *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
|
654 *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
|
655 *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
|
656 *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
|
657 } |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
658 if (is_start) { |
3716 | 659 int pes_extension = 0; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
660 /* write PES header */ |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
661 *q++ = 0x00; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
662 *q++ = 0x00; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
663 *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
|
664 private_code = 0; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
665 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { |
3716 | 666 if (st->codec->codec_id == CODEC_ID_DIRAC) { |
667 *q++ = 0xfd; | |
668 } else | |
669 *q++ = 0xe0; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
670 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
785
diff
changeset
|
671 (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
|
672 st->codec->codec_id == CODEC_ID_MP3)) { |
885 | 673 *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
|
674 } 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
|
675 *q++ = 0xbd; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
676 if (st->codec->codec_type == AVMEDIA_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
|
677 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
|
678 } |
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
|
679 } |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
680 header_len = 0; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
681 flags = 0; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
682 if (pts != AV_NOPTS_VALUE) { |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
683 header_len += 5; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
684 flags |= 0x80; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
685 } |
4913 | 686 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
|
687 header_len += 5; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
688 flags |= 0x40; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
689 } |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
690 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && |
3716 | 691 st->codec->codec_id == CODEC_ID_DIRAC) { |
692 /* set PES_extension_flag */ | |
693 pes_extension = 1; | |
694 flags |= 0x01; | |
695 | |
696 /* | |
697 * One byte for PES2 extension flag + | |
698 * one byte for extension length + | |
699 * one byte for extension id | |
700 */ | |
701 header_len += 3; | |
702 } | |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
703 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
|
704 if (private_code != 0) |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
705 len++; |
4921
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
706 if (len > 0xffff) |
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
707 len = 0; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
708 *q++ = len >> 8; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
709 *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
|
710 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
|
711 /* data alignment indicator is required for subtitle data */ |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
712 if (st->codec->codec_type == AVMEDIA_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
|
713 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
|
714 *q++ = val; |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
715 *q++ = flags; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
716 *q++ = header_len; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
717 if (pts != AV_NOPTS_VALUE) { |
1838
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
718 write_pts(q, flags >> 6, pts); |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
719 q += 5; |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
720 } |
4913 | 721 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
|
722 write_pts(q, 1, dts); |
d1af40ab8ea5
write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents:
1415
diff
changeset
|
723 q += 5; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
724 } |
3716 | 725 if (pes_extension && st->codec->codec_id == CODEC_ID_DIRAC) { |
726 flags = 0x01; /* set PES_extension_flag_2 */ | |
727 *q++ = flags; | |
728 *q++ = 0x80 | 0x01; /* marker bit + extension length */ | |
729 /* | |
730 * Set the stream id extension flag bit to 0 and | |
731 * write the extended stream id | |
732 */ | |
733 *q++ = 0x00 | 0x60; | |
734 } | |
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
|
735 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
|
736 *q++ = private_code; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
737 is_start = 0; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
738 } |
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
|
739 /* 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
|
740 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
|
741 /* 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
|
742 len = TS_PACKET_SIZE - header_len; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
743 if (len > payload_size) |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
744 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
|
745 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
|
746 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
|
747 /* 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
|
748 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
|
749 /* 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
|
750 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
|
751 memmove(buf + 4 + afc_len + stuffing_len, |
885 | 752 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
|
753 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
|
754 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
|
755 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
|
756 } 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
|
757 /* 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
|
758 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
|
759 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
|
760 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
|
761 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
|
762 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
|
763 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
|
764 } |
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
|
765 } |
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
|
766 } |
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
|
767 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
|
768 payload += len; |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
769 payload_size -= len; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
770 put_buffer(s->pb, buf, TS_PACKET_SIZE); |
4209
020395b83a14
compute pcr more accurately, regression tests need update
bcoudurier
parents:
4201
diff
changeset
|
771 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
|
772 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
773 put_flush_packet(s->pb); |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
774 } |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
775 |
468 | 776 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
|
777 { |
468 | 778 AVStream *st = s->streams[pkt->stream_index]; |
5539 | 779 int size = pkt->size; |
468 | 780 uint8_t *buf= pkt->data; |
4219
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
781 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
|
782 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
|
783 const uint64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE)*2; |
4220 | 784 int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE; |
785 | |
786 if (pkt->pts != AV_NOPTS_VALUE) | |
787 pts = pkt->pts + delay; | |
788 if (pkt->dts != AV_NOPTS_VALUE) | |
789 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
|
790 |
4915 | 791 if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) { |
792 av_log(s, AV_LOG_ERROR, "first pts value must set\n"); | |
793 return -1; | |
794 } | |
795 ts_st->first_pts_check = 0; | |
796 | |
4921
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
797 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
|
798 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
|
799 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
|
800 |
4219
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
801 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
|
802 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
|
803 "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
|
804 return -1; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
805 } |
5786
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
806 |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
807 do { |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
808 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
|
809 //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
|
810 } 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
|
811 (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
|
812 |
7d670040187e
In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents:
5784
diff
changeset
|
813 if ((state & 0x1f) != 9) { // AUD NAL |
4219
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
814 data = av_malloc(pkt->size+6); |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
815 if (!data) |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
816 return -1; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
817 memcpy(data+6, pkt->data, pkt->size); |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
818 AV_WB32(data, 0x00000001); |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
819 data[4] = 0x09; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
820 data[5] = 0xe0; // any slice type |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
821 buf = data; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
822 size = pkt->size+6; |
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
823 } |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
824 } else if (st->codec->codec_id == CODEC_ID_AAC) { |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
825 if (pkt->size < 2) |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
826 return -1; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
827 if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) { |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
828 ADTSContext *adts = ts_st->adts; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
829 int new_size; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
830 if (!adts) { |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
831 av_log(s, AV_LOG_ERROR, "aac bitstream not in adts format " |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
832 "and extradata missing\n"); |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
833 return -1; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
834 } |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
835 new_size = ADTS_HEADER_SIZE+adts->pce_size+pkt->size; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
836 if ((unsigned)new_size >= INT_MAX) |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
837 return -1; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
838 data = av_malloc(new_size); |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
839 if (!data) |
5930
08cd1179a20d
Replace all remaining occurrences of AVERROR_NOMEM with
stefano
parents:
5910
diff
changeset
|
840 return AVERROR(ENOMEM); |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
841 ff_adts_write_frame_header(adts, data, pkt->size, adts->pce_size); |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
842 if (adts->pce_size) { |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
843 memcpy(data+ADTS_HEADER_SIZE, adts->pce_data, adts->pce_size); |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
844 adts->pce_size = 0; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
845 } |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
846 memcpy(data+ADTS_HEADER_SIZE+adts->pce_size, pkt->data, pkt->size); |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
847 buf = data; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
848 size = new_size; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5786
diff
changeset
|
849 } |
4211
5e5654752973
set pts and dts of pes packets exactly according to specs
bcoudurier
parents:
4209
diff
changeset
|
850 } |
5e5654752973
set pts and dts of pes packets exactly according to specs
bcoudurier
parents:
4209
diff
changeset
|
851 |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5804
diff
changeset
|
852 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) { |
4921
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
853 // 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
|
854 mpegts_write_pes(s, st, buf, size, pts, dts); |
4922 | 855 av_free(data); |
4921
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
856 return 0; |
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
857 } |
fa21da521576
write a single pes for video frames, some proprietary player needs it
bcoudurier
parents:
4915
diff
changeset
|
858 |
5539 | 859 if (ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) { |
860 mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index, | |
861 ts_st->payload_pts, ts_st->payload_dts); | |
862 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
|
863 } |
0be83fd54e7a
simplify pes timestamps fetching, based on a patch by corp186, chasedouglas at gmail dot com
bcoudurier
parents:
4951
diff
changeset
|
864 |
5539 | 865 if (!ts_st->payload_index) { |
866 ts_st->payload_pts = pts; | |
867 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
|
868 } |
4219
3bfd8604f480
add aud nal unit if not present in h264 bitstream
bcoudurier
parents:
4217
diff
changeset
|
869 |
5539 | 870 memcpy(ts_st->payload + ts_st->payload_index, buf, size); |
871 ts_st->payload_index += size; | |
872 | |
5804
9f349253996d
In mpegts muxer, free adts context and temporary data
bcoudurier
parents:
5803
diff
changeset
|
873 av_free(data); |
9f349253996d
In mpegts muxer, free adts context and temporary data
bcoudurier
parents:
5803
diff
changeset
|
874 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
875 return 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
876 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
877 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
878 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
|
879 { |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
880 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
|
881 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
|
882 MpegTSService *service; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
883 AVStream *st; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
884 int i; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
885 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
886 /* 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
|
887 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
|
888 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
|
889 ts_st = st->priv_data; |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
890 if (ts_st->payload_index > 0) { |
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
891 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
|
892 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
|
893 } |
5804
9f349253996d
In mpegts muxer, free adts context and temporary data
bcoudurier
parents:
5803
diff
changeset
|
894 av_freep(&ts_st->adts); |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
895 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
1838
diff
changeset
|
896 put_flush_packet(s->pb); |
885 | 897 |
152
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
898 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
|
899 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
|
900 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
|
901 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
|
902 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
|
903 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
904 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
|
905 |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
906 return 0; |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
907 } |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
908 |
1167 | 909 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
|
910 "mpegts", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3420
diff
changeset
|
911 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
|
912 "video/x-mpegts", |
3420 | 913 "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
|
914 sizeof(MpegTSWrite), |
cc03a75cbde4
mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff
changeset
|
915 CODEC_ID_MP2, |
250
2d4dcb1d3e21
generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents:
241
diff
changeset
|
916 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
|
917 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
|
918 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
|
919 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
|
920 }; |