00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "avformat.h"
00023 #include "bitstream.h"
00024
00025 #define ADTS_HEADER_SIZE 7
00026
00027 typedef struct {
00028 int write_adts;
00029 int objecttype;
00030 int sample_rate_index;
00031 int channel_conf;
00032 } ADTSContext;
00033
00034 static int decode_extradata(ADTSContext *adts, uint8_t *buf, int size)
00035 {
00036 GetBitContext gb;
00037
00038 init_get_bits(&gb, buf, size * 8);
00039 adts->objecttype = get_bits(&gb, 5) - 1;
00040 adts->sample_rate_index = get_bits(&gb, 4);
00041 adts->channel_conf = get_bits(&gb, 4);
00042
00043 adts->write_adts = 1;
00044
00045 return 0;
00046 }
00047
00048 static int adts_write_header(AVFormatContext *s)
00049 {
00050 ADTSContext *adts = s->priv_data;
00051 AVCodecContext *avc = s->streams[0]->codec;
00052
00053 if(avc->extradata_size > 0)
00054 decode_extradata(adts, avc->extradata, avc->extradata_size);
00055
00056 return 0;
00057 }
00058
00059 static int adts_write_frame_header(AVFormatContext *s, int size)
00060 {
00061 ADTSContext *ctx = s->priv_data;
00062 PutBitContext pb;
00063 uint8_t buf[ADTS_HEADER_SIZE];
00064
00065 init_put_bits(&pb, buf, ADTS_HEADER_SIZE);
00066
00067
00068 put_bits(&pb, 12, 0xfff);
00069 put_bits(&pb, 1, 0);
00070 put_bits(&pb, 2, 0);
00071 put_bits(&pb, 1, 1);
00072 put_bits(&pb, 2, ctx->objecttype);
00073 put_bits(&pb, 4, ctx->sample_rate_index);
00074 put_bits(&pb, 1, 0);
00075 put_bits(&pb, 3, ctx->channel_conf);
00076 put_bits(&pb, 1, 0);
00077 put_bits(&pb, 1, 0);
00078
00079
00080 put_bits(&pb, 1, 0);
00081 put_bits(&pb, 1, 0);
00082 put_bits(&pb, 13, ADTS_HEADER_SIZE + size);
00083 put_bits(&pb, 11, 0x7ff);
00084 put_bits(&pb, 2, 0);
00085
00086 flush_put_bits(&pb);
00087 put_buffer(s->pb, buf, ADTS_HEADER_SIZE);
00088
00089 return 0;
00090 }
00091
00092 static int adts_write_packet(AVFormatContext *s, AVPacket *pkt)
00093 {
00094 ADTSContext *adts = s->priv_data;
00095 ByteIOContext *pb = s->pb;
00096
00097 if (!pkt->size)
00098 return 0;
00099 if(adts->write_adts)
00100 adts_write_frame_header(s, pkt->size);
00101 put_buffer(pb, pkt->data, pkt->size);
00102 put_flush_packet(pb);
00103
00104 return 0;
00105 }
00106
00107 AVOutputFormat adts_muxer = {
00108 "adts",
00109 "ADTS AAC",
00110 "audio/aac",
00111 "aac",
00112 sizeof(ADTSContext),
00113 CODEC_ID_AAC,
00114 CODEC_ID_NONE,
00115 adts_write_header,
00116 adts_write_packet,
00117 };