Mercurial > mplayer.hg
annotate libmpdemux/mpeg_packetizer.c @ 23978:ef6e50c3c172
Revert setting audio output channel count for FFmpeg
The FFmpeg API needs to be fixed before this can be done sanely.
ffdca wants the desired output channel count to be set in
avctx->channels. Unfortunately it also completely fails if the requested
number of channels is not available rather than returning a different
amount (if 6 channels are requested we'd probably rather use stereo than
fail completely).
ffvorbis ignores caller-set values in avctx->channels. It writes the
channel count there once during init. This means the caller can only
set the count before init because later there would be no indication
whether the channel count in avctx reflects real output.
ffwma requires the caller to supply the encoded channel count
in avctx->channels during init or it fails. So it is not possible to
set a different number of desired output channels there before init
either.
author | uau |
---|---|
date | Thu, 02 Aug 2007 21:54:14 +0000 |
parents | 181ec6001b0e |
children | f7151c256b72 |
rev | line source |
---|---|
19141 | 1 /* |
2 * Copyright (C) 2006 Benjamin Zores | |
3 * Set of helper routines for building MPEG 1/2 PS/PES packets. | |
4 * | |
5 * Based on various code bororwed from vo_mpegpes/vo_dxr2 : | |
6 * (C) 2000 Ralph Metzler <ralph@convergence.de> | |
7 * Marcus Metzler <marcus@convergence.de> | |
8 * Gerard Lantau | |
9 * | |
10 * This program is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or | |
13 * (at your option) any later version. | |
14 * | |
15 * This program is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software Foundation, | |
22 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
23 */ | |
24 | |
25 #include <unistd.h> | |
26 #include <string.h> | |
27 #include <inttypes.h> | |
28 | |
29 #include "mp_msg.h" | |
30 #include "mpeg_packetizer.h" | |
31 | |
32 #define PES_MAX_SIZE 2048 | |
33 | |
34 static unsigned char pes_header[PES_MAX_SIZE]; | |
35 | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
36 static unsigned char ps2_header[] = { |
19141 | 37 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, |
38 0x04, 0x01, 0x01, 0x86, 0xa3, 0xf8 | |
39 }; | |
40 | |
41 | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
42 static unsigned char ps1_header[] = { |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
43 0x00, 0x00, 0x01, 0xba, 0x21, 0x00, |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
44 0xb9, 0x37, 0x83, 0x80, 0xc3, 0x51, |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
45 }; |
19141 | 46 |
19149
73d8ea32ebb8
cosmetics: comments and reindentation asked by gxben
nicodvb
parents:
19148
diff
changeset
|
47 /* Send MPEG <type> PES packet */ |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
48 static int |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
49 send_mpeg_pes_packet_ll(unsigned char *data, int len, int id, uint64_t pts, |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
50 int type, unsigned char *header, int header_len, |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
51 int align4, int my_write (unsigned char *data, int len)) |
19141 | 52 { |
19240 | 53 int ptslen = (pts ? 5 : 0); |
19141 | 54 int n = 0; |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
55 int idx, plen; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
56 int hdr; |
19141 | 57 |
58 mp_msg (MSGT_HEADER, MSGL_DBG2, | |
19152 | 59 "MPEG%d PES packet: 0x%x => %lu \n", type, id, pts); |
19141 | 60 memset (pes_header, '\0', PES_MAX_SIZE); |
61 | |
62 /* startcode */ | |
63 pes_header[0] = 0; | |
64 pes_header[1] = 0; | |
65 pes_header[2] = 0x01; | |
66 pes_header[3] = id; /* stream id */ | |
67 | |
68 while (len > 0) | |
69 { | |
70 int payload_size = len; /* data + PTS */ | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
71 if(type == 2) |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
72 hdr = 3; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
73 else |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
74 hdr = (ptslen ? 0 : 1); |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
75 if (6 + hdr + ptslen + payload_size + header_len > PES_MAX_SIZE) |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
76 payload_size = PES_MAX_SIZE - 6 - hdr - ptslen - header_len; |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
77 if(align4) |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
78 payload_size &= ~3; |
19141 | 79 |
80 /* construct PES header: packetize */ | |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
81 plen = payload_size + hdr + ptslen + header_len; |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
82 pes_header[4] = plen >> 8; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
83 pes_header[5] = plen & 255; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
84 idx = 6; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
85 |
19141 | 86 if (ptslen) |
87 { | |
88 int x; | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
89 |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
90 if(type == 2) |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
91 { |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
92 pes_header[idx++] = 0x81; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
93 pes_header[idx++] = 0x80; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
94 pes_header[idx++] = ptslen; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
95 } |
19141 | 96 |
97 /* presentation time stamp */ | |
98 x = (0x02 << 4) | (((pts >> 30) & 0x07) << 1) | 1; | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
99 pes_header[idx++] = x; |
19141 | 100 |
101 x = ((((pts >> 15) & 0x7fff) << 1) | 1); | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
102 pes_header[idx++] = x >>8; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
103 pes_header[idx++] = x & 255; |
19141 | 104 |
105 x = (((pts & 0x7fff) << 1) | 1); | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
106 pes_header[idx++] = x >> 8; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
107 pes_header[idx++] = x & 255; |
19141 | 108 } |
109 else | |
110 { | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
111 if(type == 2) |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
112 { |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
113 pes_header[idx++] = 0x81; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
114 pes_header[idx++] = 0x00; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
115 pes_header[idx++] = 0x00; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
116 } |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
117 else |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
118 pes_header[idx++] = 0x0f; |
19141 | 119 } |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
120 |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
121 if(header_len) |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
122 { |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
123 memcpy(&pes_header[idx], header, header_len); |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
124 idx += header_len; |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
125 } |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
126 |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
127 my_write (pes_header, idx); |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
128 n = my_write (data, payload_size); |
19141 | 129 |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
130 len -= n; |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
131 data += n; |
19141 | 132 ptslen = 0; /* store PTS only once, at first packet! */ |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
133 if(align4 && len < 4) |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
134 break; |
19141 | 135 } |
136 | |
137 return n; | |
138 } | |
139 | |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
140 int |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
141 send_mpeg_pes_packet (unsigned char *data, int len, int id, uint64_t pts, |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
142 int type, int my_write (unsigned char *data, int len)) |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
143 { |
20116 | 144 return send_mpeg_pes_packet_ll(data, len, id, pts, type, NULL, 0, 0, my_write); |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
145 } |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
146 |
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
147 |
19149
73d8ea32ebb8
cosmetics: comments and reindentation asked by gxben
nicodvb
parents:
19148
diff
changeset
|
148 /* Send MPEG <type> PS packet */ |
19141 | 149 int |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
150 send_mpeg_ps_packet(unsigned char *data, int len, int id, uint64_t pts, int type, |
19141 | 151 int my_write (unsigned char *data, int len)) |
152 { | |
19148
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
153 if(type == 2) |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
154 my_write (ps2_header, sizeof (ps2_header)); |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
155 else |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
156 my_write (ps1_header, sizeof (ps1_header)); |
3b839a8d297a
simplified mpeg packetizer used by hw mpeg decoders/vo - first round
nicodvb
parents:
19141
diff
changeset
|
157 return send_mpeg_pes_packet (data, len, id, pts, type, my_write); |
19141 | 158 } |
159 | |
19149
73d8ea32ebb8
cosmetics: comments and reindentation asked by gxben
nicodvb
parents:
19148
diff
changeset
|
160 /* Send MPEG 2 LPCM packet */ |
19141 | 161 int |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
162 send_mpeg_lpcm_packet(unsigned char* data, int len, |
19141 | 163 int id, uint64_t pts, int freq_id, |
164 int my_write (unsigned char *data, int len)) | |
165 { | |
19243
73443b22df17
final cleanup: implemented send_mpeg_pes_packet() and send_mpeg_lpcm_packet() using new send_mpeg_pes_packet_ll()
nicodvb
parents:
19240
diff
changeset
|
166 unsigned char header[7] = {0xA0, 0x07, 0x00, 0x04, 0x0C, 1 | (freq_id << 4), 0x80}; |
19244
5e5d323b1934
re-added forgotten return in send_mpeg_lpcm_packet()
nicodvb
parents:
19243
diff
changeset
|
167 return send_mpeg_pes_packet_ll(data, len, 0xBD, pts, 2, header, sizeof(header), 1, my_write); |
19141 | 168 } |