ffmpeg / libavcodec / libvo-aacenc.c @ ff5278d8
History | View | Annotate | Download (3.98 KB)
1 | d89e738a | Martin Storsjö | /*
|
---|---|---|---|
2 | * AAC encoder wrapper
|
||
3 | * Copyright (c) 2010 Martin Storsjo
|
||
4 | *
|
||
5 | * This file is part of Libav.
|
||
6 | *
|
||
7 | * Libav is free software; you can redistribute it and/or
|
||
8 | * modify it under the terms of the GNU Lesser General Public
|
||
9 | * License as published by the Free Software Foundation; either
|
||
10 | * version 2.1 of the License, or (at your option) any later version.
|
||
11 | *
|
||
12 | * Libav is distributed in the hope that it will be useful,
|
||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
15 | * Lesser General Public License for more details.
|
||
16 | *
|
||
17 | * You should have received a copy of the GNU Lesser General Public
|
||
18 | * License along with Libav; if not, write to the Free Software
|
||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||
20 | */
|
||
21 | |||
22 | #include <vo-aacenc/voAAC.h> |
||
23 | #include <vo-aacenc/cmnMemory.h> |
||
24 | |||
25 | #include "avcodec.h" |
||
26 | #include "mpeg4audio.h" |
||
27 | |||
28 | typedef struct AACContext { |
||
29 | VO_AUDIO_CODECAPI codec_api; |
||
30 | VO_HANDLE handle; |
||
31 | VO_MEM_OPERATOR mem_operator; |
||
32 | VO_CODEC_INIT_USERDATA user_data; |
||
33 | } AACContext; |
||
34 | |||
35 | static av_cold int aac_encode_init(AVCodecContext *avctx) |
||
36 | { |
||
37 | AACContext *s = avctx->priv_data; |
||
38 | AACENC_PARAM params = { 0 };
|
||
39 | int index;
|
||
40 | |||
41 | avctx->coded_frame = avcodec_alloc_frame(); |
||
42 | avctx->frame_size = 1024;
|
||
43 | |||
44 | voGetAACEncAPI(&s->codec_api); |
||
45 | |||
46 | s->mem_operator.Alloc = cmnMemAlloc; |
||
47 | s->mem_operator.Copy = cmnMemCopy; |
||
48 | s->mem_operator.Free = cmnMemFree; |
||
49 | s->mem_operator.Set = cmnMemSet; |
||
50 | s->mem_operator.Check = cmnMemCheck; |
||
51 | s->user_data.memflag = VO_IMF_USERMEMOPERATOR; |
||
52 | s->user_data.memData = &s->mem_operator; |
||
53 | s->codec_api.Init(&s->handle, VO_AUDIO_CodingAAC, &s->user_data); |
||
54 | |||
55 | params.sampleRate = avctx->sample_rate; |
||
56 | params.bitRate = avctx->bit_rate; |
||
57 | params.nChannels = avctx->channels; |
||
58 | params.adtsUsed = !(avctx->flags & CODEC_FLAG_GLOBAL_HEADER); |
||
59 | if (s->codec_api.SetParam(s->handle, VO_PID_AAC_ENCPARAM, ¶ms)
|
||
60 | != VO_ERR_NONE) { |
||
61 | av_log(avctx, AV_LOG_ERROR, "Unable to set encoding parameters\n");
|
||
62 | return AVERROR_UNKNOWN;
|
||
63 | } |
||
64 | |||
65 | avctx->extradata_size = 2;
|
||
66 | avctx->extradata = av_mallocz(avctx->extradata_size + |
||
67 | FF_INPUT_BUFFER_PADDING_SIZE); |
||
68 | if (!avctx->extradata)
|
||
69 | return AVERROR(ENOMEM);
|
||
70 | |||
71 | for (index = 0; index < 16; index++) |
||
72 | if (avctx->sample_rate == ff_mpeg4audio_sample_rates[index])
|
||
73 | break;
|
||
74 | if (index == 16) { |
||
75 | av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n",
|
||
76 | avctx->sample_rate); |
||
77 | return AVERROR_NOTSUPP;
|
||
78 | } |
||
79 | avctx->extradata[0] = 0x02 << 3 | index >> 1; |
||
80 | avctx->extradata[1] = (index & 0x01) << 7 | avctx->channels << 3; |
||
81 | return 0; |
||
82 | } |
||
83 | |||
84 | static int aac_encode_close(AVCodecContext *avctx) |
||
85 | { |
||
86 | AACContext *s = avctx->priv_data; |
||
87 | |||
88 | s->codec_api.Uninit(s->handle); |
||
89 | av_freep(&avctx->coded_frame); |
||
90 | |||
91 | return 0; |
||
92 | } |
||
93 | |||
94 | static int aac_encode_frame(AVCodecContext *avctx, |
||
95 | unsigned char *frame/*out*/, |
||
96 | int buf_size, void *data/*in*/) |
||
97 | { |
||
98 | AACContext *s = avctx->priv_data; |
||
99 | VO_CODECBUFFER input = { 0 }, output = { 0 }; |
||
100 | VO_AUDIO_OUTPUTINFO output_info = { { 0 } };
|
||
101 | |||
102 | input.Buffer = data; |
||
103 | input.Length = 2 * avctx->channels * avctx->frame_size;
|
||
104 | output.Buffer = frame; |
||
105 | output.Length = buf_size; |
||
106 | |||
107 | s->codec_api.SetInputData(s->handle, &input); |
||
108 | if (s->codec_api.GetOutputData(s->handle, &output, &output_info)
|
||
109 | != VO_ERR_NONE) { |
||
110 | av_log(avctx, AV_LOG_ERROR, "Unable to encode frame\n");
|
||
111 | return AVERROR_UNKNOWN;
|
||
112 | } |
||
113 | return output.Length;
|
||
114 | } |
||
115 | |||
116 | AVCodec ff_libvo_aacenc_encoder = { |
||
117 | "libvo_aacenc",
|
||
118 | CODEC_TYPE_AUDIO, |
||
119 | CODEC_ID_AAC, |
||
120 | sizeof(AACContext),
|
||
121 | aac_encode_init, |
||
122 | aac_encode_frame, |
||
123 | aac_encode_close, |
||
124 | NULL,
|
||
125 | c5e03ceb | Martin Storsjö | .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, |
126 | ff5278d8 | Carl Eugen Hoyos | .long_name = NULL_IF_CONFIG_SMALL("VisualOn libvo-aacenc AAC"),
|
127 | d89e738a | Martin Storsjö | }; |