Mercurial > libavformat.hg
annotate adtsenc.c @ 3068:9cc9ff5aff9c libavformat
set bps to uncompressed original sound data for compressed audio
according to aiff specs, qt set it to 16 for mace and ima4,
fail if block align is not set.
author | bcoudurier |
---|---|
date | Mon, 25 Feb 2008 12:00:31 +0000 |
parents | d52c718e83f9 |
children | 6f61c3b36632 |
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 */ | |
22 #include "avformat.h" | |
23 #include "bitstream.h" | |
24 | |
25 #define ADTS_HEADER_SIZE 7 | |
26 | |
27 typedef struct { | |
28 int write_adts; | |
29 int objecttype; | |
30 int sample_rate_index; | |
31 int channel_conf; | |
32 } ADTSContext; | |
33 | |
34 static int decode_extradata(ADTSContext *adts, uint8_t *buf, int size) | |
35 { | |
36 GetBitContext gb; | |
37 | |
38 init_get_bits(&gb, buf, size * 8); | |
39 adts->objecttype = get_bits(&gb, 5) - 1; | |
40 adts->sample_rate_index = get_bits(&gb, 4); | |
41 adts->channel_conf = get_bits(&gb, 4); | |
42 | |
43 adts->write_adts = 1; | |
44 | |
45 return 0; | |
46 } | |
47 | |
48 static int adts_write_header(AVFormatContext *s) | |
49 { | |
50 ADTSContext *adts = s->priv_data; | |
51 AVCodecContext *avc = s->streams[0]->codec; | |
52 | |
53 if(avc->extradata_size > 0) | |
54 decode_extradata(adts, avc->extradata, avc->extradata_size); | |
55 | |
56 return 0; | |
57 } | |
58 | |
59 static int adts_write_frame_header(AVFormatContext *s, int size) | |
60 { | |
61 ADTSContext *ctx = s->priv_data; | |
62 PutBitContext pb; | |
63 uint8_t buf[ADTS_HEADER_SIZE]; | |
64 | |
65 init_put_bits(&pb, buf, ADTS_HEADER_SIZE); | |
66 | |
67 /* adts_fixed_header */ | |
68 put_bits(&pb, 12, 0xfff); /* syncword */ | |
69 put_bits(&pb, 1, 0); /* ID */ | |
70 put_bits(&pb, 2, 0); /* layer */ | |
71 put_bits(&pb, 1, 1); /* protection_absent */ | |
72 put_bits(&pb, 2, ctx->objecttype); /* profile_objecttype */ | |
73 put_bits(&pb, 4, ctx->sample_rate_index); | |
74 put_bits(&pb, 1, 0); /* private_bit */ | |
75 put_bits(&pb, 3, ctx->channel_conf); /* channel_configuration */ | |
76 put_bits(&pb, 1, 0); /* original_copy */ | |
77 put_bits(&pb, 1, 0); /* home */ | |
78 | |
79 /* adts_variable_header */ | |
80 put_bits(&pb, 1, 0); /* copyright_identification_bit */ | |
81 put_bits(&pb, 1, 0); /* copyright_identification_start */ | |
82 put_bits(&pb, 13, ADTS_HEADER_SIZE + size); /* aac_frame_length */ | |
83 put_bits(&pb, 11, 0x7ff); /* adts_buffer_fullness */ | |
84 put_bits(&pb, 2, 0); /* number_of_raw_data_blocks_in_frame */ | |
85 | |
86 flush_put_bits(&pb); | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2218
diff
changeset
|
87 put_buffer(s->pb, buf, ADTS_HEADER_SIZE); |
939 | 88 |
89 return 0; | |
90 } | |
91 | |
92 static int adts_write_packet(AVFormatContext *s, AVPacket *pkt) | |
93 { | |
94 ADTSContext *adts = s->priv_data; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2218
diff
changeset
|
95 ByteIOContext *pb = s->pb; |
939 | 96 |
1043 | 97 if (!pkt->size) |
98 return 0; | |
939 | 99 if(adts->write_adts) |
100 adts_write_frame_header(s, pkt->size); | |
101 put_buffer(pb, pkt->data, pkt->size); | |
1041 | 102 put_flush_packet(pb); |
939 | 103 |
104 return 0; | |
105 } | |
106 | |
1169 | 107 AVOutputFormat adts_muxer = { |
939 | 108 "adts", |
109 "ADTS AAC", | |
110 "audio/aac", | |
111 "aac", | |
112 sizeof(ADTSContext), | |
113 CODEC_ID_AAC, | |
114 CODEC_ID_NONE, | |
115 adts_write_header, | |
116 adts_write_packet, | |
117 }; |