Mercurial > libavformat.hg
annotate adtsenc.c @ 5565:befe2f0f9a00 libavformat
Use the configure check from r21351 and use it to properly define struct
sockaddr (in case it's not missing) so it always works on the system that
we are defining it for, in a RFC-2553/3493-compliant way (i.e. containing
a ss_family field). which is used in udp.c. Patch by Martin Storsj
<$firstname $firstname st>.
author | rbultje |
---|---|
date | Wed, 20 Jan 2010 17:26:14 +0000 |
parents | cc9c5e6b8ccf |
children | 667736f463b3 |
rev | line source |
---|---|
939 | 1 /* |
2 * ADTS muxer. | |
3 * Copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@smartjog.com> | |
2218 | 4 * Mans Rullgard <mans@mansr.com> |
939 | 5 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
6 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
7 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
939 | 9 * modify it under the terms of the GNU Lesser General Public |
10 * 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
|
11 * version 2.1 of the License, or (at your option) any later version. |
939 | 12 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
939 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * 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
|
19 * License along with FFmpeg; if not, write to the Free Software |
939 | 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 */ | |
3286 | 22 |
4872 | 23 #include "libavcodec/get_bits.h" |
4864
7aa7c5853bb6
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
4666
diff
changeset
|
24 #include "libavcodec/put_bits.h" |
5079
cc9c5e6b8ccf
Use av_log_missing_feature in the ADTS encoder. (Pseudo reverts r19173).
alexc
parents:
5025
diff
changeset
|
25 #include "libavcodec/avcodec.h" |
4934 | 26 #include "libavcodec/mpeg4audio.h" |
939 | 27 #include "avformat.h" |
28 | |
29 #define ADTS_HEADER_SIZE 7 | |
30 | |
31 typedef struct { | |
32 int write_adts; | |
33 int objecttype; | |
34 int sample_rate_index; | |
35 int channel_conf; | |
4934 | 36 int pce_size; |
37 uint8_t pce_data[MAX_PCE_SIZE]; | |
939 | 38 } ADTSContext; |
39 | |
4467
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
40 static int decode_extradata(AVFormatContext *s, ADTSContext *adts, uint8_t *buf, int size) |
939 | 41 { |
42 GetBitContext gb; | |
4934 | 43 PutBitContext pb; |
939 | 44 |
45 init_get_bits(&gb, buf, size * 8); | |
46 adts->objecttype = get_bits(&gb, 5) - 1; | |
47 adts->sample_rate_index = get_bits(&gb, 4); | |
48 adts->channel_conf = get_bits(&gb, 4); | |
49 | |
4666
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
50 if (adts->objecttype > 3U) { |
4468
d23db4a449ed
Report the illegal audio object type, not it offset by 1.
alexc
parents:
4467
diff
changeset
|
51 av_log(s, AV_LOG_ERROR, "MPEG-4 AOT %d is not allowed in ADTS\n", adts->objecttype+1); |
4467
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
52 return -1; |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
53 } |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
54 if (adts->sample_rate_index == 15) { |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
55 av_log(s, AV_LOG_ERROR, "Escape sample rate index illegal in ADTS\n"); |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
56 return -1; |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
57 } |
4666
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
58 if (get_bits(&gb, 1)) { |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
59 av_log(s, AV_LOG_ERROR, "960/120 MDCT window is not allowed in ADTS\n"); |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
60 return -1; |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
61 } |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
62 if (get_bits(&gb, 1)) { |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
63 av_log(s, AV_LOG_ERROR, "Scalable configurations are not allowed in ADTS\n"); |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
64 return -1; |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
65 } |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
66 if (get_bits(&gb, 1)) { |
5079
cc9c5e6b8ccf
Use av_log_missing_feature in the ADTS encoder. (Pseudo reverts r19173).
alexc
parents:
5025
diff
changeset
|
67 av_log_missing_feature(s, "Signaled SBR or PS", 0); |
4666
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
68 return -1; |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
69 } |
4934 | 70 if (!adts->channel_conf) { |
71 init_put_bits(&pb, adts->pce_data, MAX_PCE_SIZE); | |
72 | |
73 put_bits(&pb, 3, 5); //ID_PCE | |
74 adts->pce_size = (ff_copy_pce_data(&pb, &gb) + 3) / 8; | |
75 flush_put_bits(&pb); | |
76 } | |
4467
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
77 |
939 | 78 adts->write_adts = 1; |
79 | |
80 return 0; | |
81 } | |
82 | |
83 static int adts_write_header(AVFormatContext *s) | |
84 { | |
85 ADTSContext *adts = s->priv_data; | |
86 AVCodecContext *avc = s->streams[0]->codec; | |
87 | |
4467
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
88 if(avc->extradata_size > 0 && |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
89 decode_extradata(s, adts, avc->extradata, avc->extradata_size) < 0) |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
90 return -1; |
939 | 91 |
92 return 0; | |
93 } | |
94 | |
95 static int adts_write_frame_header(AVFormatContext *s, int size) | |
96 { | |
97 ADTSContext *ctx = s->priv_data; | |
98 PutBitContext pb; | |
99 uint8_t buf[ADTS_HEADER_SIZE]; | |
100 | |
101 init_put_bits(&pb, buf, ADTS_HEADER_SIZE); | |
102 | |
103 /* adts_fixed_header */ | |
104 put_bits(&pb, 12, 0xfff); /* syncword */ | |
105 put_bits(&pb, 1, 0); /* ID */ | |
106 put_bits(&pb, 2, 0); /* layer */ | |
107 put_bits(&pb, 1, 1); /* protection_absent */ | |
108 put_bits(&pb, 2, ctx->objecttype); /* profile_objecttype */ | |
109 put_bits(&pb, 4, ctx->sample_rate_index); | |
110 put_bits(&pb, 1, 0); /* private_bit */ | |
111 put_bits(&pb, 3, ctx->channel_conf); /* channel_configuration */ | |
112 put_bits(&pb, 1, 0); /* original_copy */ | |
113 put_bits(&pb, 1, 0); /* home */ | |
114 | |
115 /* adts_variable_header */ | |
116 put_bits(&pb, 1, 0); /* copyright_identification_bit */ | |
117 put_bits(&pb, 1, 0); /* copyright_identification_start */ | |
4934 | 118 put_bits(&pb, 13, ADTS_HEADER_SIZE + size + ctx->pce_size); /* aac_frame_length */ |
939 | 119 put_bits(&pb, 11, 0x7ff); /* adts_buffer_fullness */ |
120 put_bits(&pb, 2, 0); /* number_of_raw_data_blocks_in_frame */ | |
121 | |
122 flush_put_bits(&pb); | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2218
diff
changeset
|
123 put_buffer(s->pb, buf, ADTS_HEADER_SIZE); |
4934 | 124 if (ctx->pce_size) { |
125 put_buffer(s->pb, ctx->pce_data, ctx->pce_size); | |
126 ctx->pce_size = 0; | |
127 } | |
939 | 128 |
129 return 0; | |
130 } | |
131 | |
132 static int adts_write_packet(AVFormatContext *s, AVPacket *pkt) | |
133 { | |
134 ADTSContext *adts = s->priv_data; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2218
diff
changeset
|
135 ByteIOContext *pb = s->pb; |
939 | 136 |
1043 | 137 if (!pkt->size) |
138 return 0; | |
939 | 139 if(adts->write_adts) |
140 adts_write_frame_header(s, pkt->size); | |
141 put_buffer(pb, pkt->data, pkt->size); | |
1041 | 142 put_flush_packet(pb); |
939 | 143 |
144 return 0; | |
145 } | |
146 | |
1169 | 147 AVOutputFormat adts_muxer = { |
939 | 148 "adts", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3286
diff
changeset
|
149 NULL_IF_CONFIG_SMALL("ADTS AAC"), |
939 | 150 "audio/aac", |
5003 | 151 "aac,adts", |
939 | 152 sizeof(ADTSContext), |
153 CODEC_ID_AAC, | |
154 CODEC_ID_NONE, | |
155 adts_write_header, | |
156 adts_write_packet, | |
157 }; |