Mercurial > libavformat.hg
annotate adtsenc.c @ 5836:2997c88028cd libavformat
Move the probe loop from av_open_input_file() into its own method
av_probe_input_buffer() so that it can be reused. Here are a few
differences to the original way things were probed:
- maximum probe buffer size can be specified as a parameter.
- offset within the stream to probe from can be specified as a parameter.
- instead of seeking back to the start each time a probe fails, stream
data is appended to the reallocated buffer. This lowers the amount
of data read from the stream (there is no repetition) and results in
fewer closed and reopened streams (when seeking fails).
New attempt after r22296, which was revert in r22315 due to a FATE
failure.
See the thread:
Subject: [FFmpeg-devel] [PATCH] Move av_open_input_file probe loop to its own method
Date: 2010-03-05 03:23:57 GMT
Patch by Micah F. Galizia printf("%s%s@%s.%s", "micah", "galizia", "gmail", "com").
author | stefano |
---|---|
date | Sun, 14 Mar 2010 22:40:16 +0000 |
parents | 667736f463b3 |
children | 1327f1008940 |
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" |
939 | 26 #include "avformat.h" |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
27 #include "adts.h" |
939 | 28 |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
29 int ff_adts_decode_extradata(AVFormatContext *s, ADTSContext *adts, uint8_t *buf, int size) |
939 | 30 { |
31 GetBitContext gb; | |
4934 | 32 PutBitContext pb; |
939 | 33 |
34 init_get_bits(&gb, buf, size * 8); | |
35 adts->objecttype = get_bits(&gb, 5) - 1; | |
36 adts->sample_rate_index = get_bits(&gb, 4); | |
37 adts->channel_conf = get_bits(&gb, 4); | |
38 | |
4666
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
39 if (adts->objecttype > 3U) { |
4468
d23db4a449ed
Report the illegal audio object type, not it offset by 1.
alexc
parents:
4467
diff
changeset
|
40 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
|
41 return -1; |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
42 } |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
43 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
|
44 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
|
45 return -1; |
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
46 } |
4666
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
47 if (get_bits(&gb, 1)) { |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
48 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
|
49 return -1; |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
50 } |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
51 if (get_bits(&gb, 1)) { |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
52 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
|
53 return -1; |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
54 } |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
55 if (get_bits(&gb, 1)) { |
5079
cc9c5e6b8ccf
Use av_log_missing_feature in the ADTS encoder. (Pseudo reverts r19173).
alexc
parents:
5025
diff
changeset
|
56 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
|
57 return -1; |
bf7e0b55d9ec
ADTS: Increased protection against writing illegal/nonsense files.
alexc
parents:
4482
diff
changeset
|
58 } |
4934 | 59 if (!adts->channel_conf) { |
60 init_put_bits(&pb, adts->pce_data, MAX_PCE_SIZE); | |
61 | |
62 put_bits(&pb, 3, 5); //ID_PCE | |
63 adts->pce_size = (ff_copy_pce_data(&pb, &gb) + 3) / 8; | |
64 flush_put_bits(&pb); | |
65 } | |
4467
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
66 |
939 | 67 adts->write_adts = 1; |
68 | |
69 return 0; | |
70 } | |
71 | |
72 static int adts_write_header(AVFormatContext *s) | |
73 { | |
74 ADTSContext *adts = s->priv_data; | |
75 AVCodecContext *avc = s->streams[0]->codec; | |
76 | |
4467
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
77 if(avc->extradata_size > 0 && |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
78 ff_adts_decode_extradata(s, adts, avc->extradata, avc->extradata_size) < 0) |
4467
1dae64d3a6ff
ADTS Muxer: Refuse to write illegal ADTS files by checking validity of header
superdump
parents:
3424
diff
changeset
|
79 return -1; |
939 | 80 |
81 return 0; | |
82 } | |
83 | |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
84 int ff_adts_write_frame_header(ADTSContext *ctx, |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
85 uint8_t *buf, int size, int pce_size) |
939 | 86 { |
87 PutBitContext pb; | |
88 | |
89 init_put_bits(&pb, buf, ADTS_HEADER_SIZE); | |
90 | |
91 /* adts_fixed_header */ | |
92 put_bits(&pb, 12, 0xfff); /* syncword */ | |
93 put_bits(&pb, 1, 0); /* ID */ | |
94 put_bits(&pb, 2, 0); /* layer */ | |
95 put_bits(&pb, 1, 1); /* protection_absent */ | |
96 put_bits(&pb, 2, ctx->objecttype); /* profile_objecttype */ | |
97 put_bits(&pb, 4, ctx->sample_rate_index); | |
98 put_bits(&pb, 1, 0); /* private_bit */ | |
99 put_bits(&pb, 3, ctx->channel_conf); /* channel_configuration */ | |
100 put_bits(&pb, 1, 0); /* original_copy */ | |
101 put_bits(&pb, 1, 0); /* home */ | |
102 | |
103 /* adts_variable_header */ | |
104 put_bits(&pb, 1, 0); /* copyright_identification_bit */ | |
105 put_bits(&pb, 1, 0); /* copyright_identification_start */ | |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
106 put_bits(&pb, 13, ADTS_HEADER_SIZE + size + pce_size); /* aac_frame_length */ |
939 | 107 put_bits(&pb, 11, 0x7ff); /* adts_buffer_fullness */ |
108 put_bits(&pb, 2, 0); /* number_of_raw_data_blocks_in_frame */ | |
109 | |
110 flush_put_bits(&pb); | |
111 | |
112 return 0; | |
113 } | |
114 | |
115 static int adts_write_packet(AVFormatContext *s, AVPacket *pkt) | |
116 { | |
117 ADTSContext *adts = s->priv_data; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2218
diff
changeset
|
118 ByteIOContext *pb = s->pb; |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
119 uint8_t buf[ADTS_HEADER_SIZE]; |
939 | 120 |
1043 | 121 if (!pkt->size) |
122 return 0; | |
5787
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
123 if(adts->write_adts) { |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
124 ff_adts_write_frame_header(adts, buf, pkt->size, adts->pce_size); |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
125 put_buffer(pb, buf, ADTS_HEADER_SIZE); |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
126 if(adts->pce_size) { |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
127 put_buffer(pb, adts->pce_data, adts->pce_size); |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
128 adts->pce_size = 0; |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
129 } |
667736f463b3
In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents:
5079
diff
changeset
|
130 } |
939 | 131 put_buffer(pb, pkt->data, pkt->size); |
1041 | 132 put_flush_packet(pb); |
939 | 133 |
134 return 0; | |
135 } | |
136 | |
1169 | 137 AVOutputFormat adts_muxer = { |
939 | 138 "adts", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3286
diff
changeset
|
139 NULL_IF_CONFIG_SMALL("ADTS AAC"), |
939 | 140 "audio/aac", |
5003 | 141 "aac,adts", |
939 | 142 sizeof(ADTSContext), |
143 CODEC_ID_AAC, | |
144 CODEC_ID_NONE, | |
145 adts_write_header, | |
146 adts_write_packet, | |
147 }; |