Mercurial > mplayer.hg
annotate libaf/af_lavcac3enc.c @ 27980:21779d5ea61c
Create a separate codecs.conf entry for Tremor and use it if MPlayer is
with Tremor support instead of libvorbis. Previously MPlayer would show
the same output on the console when decoding with libvorbis and Tremor.
author | diego |
---|---|
date | Mon, 24 Nov 2008 08:31:44 +0000 |
parents | b3a38b361fef |
children | 8c706ce21c6f |
rev | line source |
---|---|
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
1 /* |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
2 * audio filter for runtime AC-3 encoding with libavcodec. |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
3 * |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
4 * Copyright (C) 2007 Ulion <ulion A gmail P com> |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
5 * |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
6 * This file is part of MPlayer. |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
7 * |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or modify |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
11 * (at your option) any later version. |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
12 * |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
16 * GNU General Public License for more details. |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
17 * |
26740
b3a38b361fef
Use standard license headers with standard formatting.
diego
parents:
26120
diff
changeset
|
18 * You should have received a copy of the GNU General Public License along |
b3a38b361fef
Use standard license headers with standard formatting.
diego
parents:
26120
diff
changeset
|
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
b3a38b361fef
Use standard license headers with standard formatting.
diego
parents:
26120
diff
changeset
|
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
21 */ |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
22 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
23 #include <stdio.h> |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
24 #include <stdlib.h> |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
25 #include <string.h> |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
26 #include <inttypes.h> |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
27 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
28 #include "config.h" |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
29 #include "af.h" |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
30 #include "help_mp.h" |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
31 #include "reorder_ch.h" |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
32 |
26120 | 33 #include "libavcodec/avcodec.h" |
34 #include "libavcodec/ac3.h" | |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
35 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
36 // Data for specific instances of this filter |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
37 typedef struct af_ac3enc_s { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
38 struct AVCodec *lavc_acodec; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
39 struct AVCodecContext *lavc_actx; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
40 int add_iec61937_header; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
41 int bit_rate; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
42 char *pending_data; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
43 int pending_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
44 int expect_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
45 int min_channel_num; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
46 } af_ac3enc_t; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
47 |
25962 | 48 extern int avcodec_initialized; |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
49 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
50 // Initialization and runtime control |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
51 static int control(struct af_instance_s *af, int cmd, void *arg) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
52 { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
53 af_ac3enc_t *s = (af_ac3enc_t *)af->setup; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
54 af_data_t *data = (af_data_t *)arg; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
55 int i, bit_rate, test_output_res; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
56 static const int default_bit_rate[AC3_MAX_CHANNELS+1] = \ |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
57 {0, 96000, 192000, 256000, 384000, 448000, 448000}; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
58 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
59 switch (cmd){ |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
60 case AF_CONTROL_REINIT: |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
61 if (data->format == AF_FORMAT_AC3 || data->nch < s->min_channel_num) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
62 return AF_DETACH; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
63 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
64 s->pending_len = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
65 s->expect_len = AC3_FRAME_SIZE * data->nch * data->bps; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
66 if (s->add_iec61937_header) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
67 af->mul = (double)AC3_FRAME_SIZE * 2 * 2 / s->expect_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
68 else |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
69 af->mul = (double)AC3_MAX_CODED_FRAME_SIZE / s->expect_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
70 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
71 af_msg(AF_MSG_DEBUG0, "af_lavcac3enc reinit: %d, %d, %f, %d.\n", |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
72 data->nch, data->rate, af->mul, s->expect_len); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
73 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
74 af->data->format = AF_FORMAT_S16_NE; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
75 if (data->rate == 48000 || data->rate == 44100 || data->rate == 32000) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
76 af->data->rate = data->rate; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
77 else |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
78 af->data->rate = 48000; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
79 if (data->nch > AC3_MAX_CHANNELS) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
80 af->data->nch = AC3_MAX_CHANNELS; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
81 else |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
82 af->data->nch = data->nch; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
83 af->data->bps = 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
84 test_output_res = af_test_output(af, data); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
85 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
86 bit_rate = s->bit_rate ? s->bit_rate : default_bit_rate[af->data->nch]; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
87 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
88 if (s->lavc_actx->channels != af->data->nch || |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
89 s->lavc_actx->sample_rate != af->data->rate || |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
90 s->lavc_actx->bit_rate != bit_rate) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
91 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
92 if (s->lavc_actx->codec) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
93 avcodec_close(s->lavc_actx); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
94 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
95 // Put sample parameters |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
96 s->lavc_actx->channels = af->data->nch; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
97 s->lavc_actx->sample_rate = af->data->rate; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
98 s->lavc_actx->bit_rate = bit_rate; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
99 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
100 if(avcodec_open(s->lavc_actx, s->lavc_acodec) < 0) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
101 af_msg(AF_MSG_ERROR, MSGTR_CouldntOpenCodec, "ac3", bit_rate); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
102 return AF_ERROR; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
103 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
104 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
105 af->data->format = AF_FORMAT_AC3; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
106 af->data->nch = 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
107 return test_output_res; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
108 case AF_CONTROL_COMMAND_LINE: |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
109 af_msg(AF_MSG_DEBUG0, "af_lavcac3enc cmdline: %s.\n", (char*)arg); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
110 s->bit_rate = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
111 s->min_channel_num = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
112 s->add_iec61937_header = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
113 sscanf((char*)arg,"%d:%d:%d", &s->add_iec61937_header, &s->bit_rate, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
114 &s->min_channel_num); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
115 if (s->bit_rate < 1000) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
116 s->bit_rate *= 1000; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
117 if (s->bit_rate) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
118 for (i = 0; i < 19; ++i) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
119 if (ff_ac3_bitrate_tab[i] * 1000 == s->bit_rate) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
120 break; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
121 if (i >= 19) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
122 af_msg(AF_MSG_WARN, "af_lavcac3enc unable set unsupported " |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
123 "bitrate %d, use default bitrate (check manpage to see " |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
124 "supported bitrates).\n", s->bit_rate); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
125 s->bit_rate = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
126 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
127 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
128 if (s->min_channel_num == 0) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
129 s->min_channel_num = 5; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
130 af_msg(AF_MSG_VERBOSE, "af_lavcac3enc config spdif:%d, bitrate:%d, " |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
131 "minchnum:%d.\n", s->add_iec61937_header, s->bit_rate, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
132 s->min_channel_num); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
133 return AF_OK; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
134 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
135 return AF_UNKNOWN; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
136 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
137 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
138 // Deallocate memory |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
139 static void uninit(struct af_instance_s* af) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
140 { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
141 if (af->data) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
142 free(af->data->audio); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
143 free(af->data); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
144 if (af->setup) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
145 af_ac3enc_t *s = af->setup; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
146 af->setup = NULL; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
147 if(s->lavc_actx) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
148 if (s->lavc_actx->codec) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
149 avcodec_close(s->lavc_actx); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
150 free(s->lavc_actx); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
151 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
152 free(s->pending_data); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
153 free(s); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
154 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
155 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
156 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
157 // Filter data through filter |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
158 static af_data_t* play(struct af_instance_s* af, af_data_t* data) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
159 { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
160 af_ac3enc_t *s = af->setup; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
161 af_data_t *c = data; // Current working data |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
162 af_data_t *l; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
163 int len, left, outsize = 0, destsize; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
164 char *buf, *src, *dest; |
25642
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
165 int max_output_len; |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
166 int frame_num = (data->len + s->pending_len) / s->expect_len; |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
167 |
25642
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
168 if (s->add_iec61937_header) |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
169 max_output_len = AC3_FRAME_SIZE * 2 * 2 * frame_num; |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
170 else |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
171 max_output_len = AC3_MAX_CODED_FRAME_SIZE * frame_num; |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
172 |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
173 if (af->data->len < max_output_len) { |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
174 af_msg(AF_MSG_VERBOSE,"[libaf] Reallocating memory in module %s, " |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
175 "old len = %i, new len = %i\n", af->info->name, af->data->len, |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
176 max_output_len); |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
177 free(af->data->audio); |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
178 af->data->audio = malloc(max_output_len); |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
179 if (!af->data->audio) { |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
180 af_msg(AF_MSG_FATAL,"[libaf] Could not allocate memory \n"); |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
181 return NULL; |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
182 } |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
183 af->data->len = max_output_len; |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
184 } |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
185 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
186 l = af->data; // Local data |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
187 buf = (char *)l->audio; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
188 src = (char *)c->audio; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
189 left = c->len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
190 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
191 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
192 while (left > 0) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
193 if (left + s->pending_len < s->expect_len) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
194 memcpy(s->pending_data + s->pending_len, src, left); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
195 src += left; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
196 s->pending_len += left; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
197 left = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
198 break; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
199 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
200 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
201 dest = s->add_iec61937_header ? buf + 8 : buf; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
202 destsize = (char *)l->audio + l->len - buf; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
203 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
204 if (s->pending_len) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
205 int needs = s->expect_len - s->pending_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
206 if (needs > 0) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
207 memcpy(s->pending_data + s->pending_len, src, needs); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
208 src += needs; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
209 left -= needs; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
210 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
211 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
212 if (c->nch >= 5) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
213 reorder_channel_nch(s->pending_data, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
214 AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
215 AF_CHANNEL_LAYOUT_LAVC_AC3_DEFAULT, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
216 c->nch, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
217 s->expect_len / 2, 2); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
218 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
219 len = avcodec_encode_audio(s->lavc_actx, dest, destsize, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
220 (void *)s->pending_data); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
221 s->pending_len = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
222 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
223 else { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
224 if (c->nch >= 5) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
225 reorder_channel_nch(src, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
226 AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
227 AF_CHANNEL_LAYOUT_LAVC_AC3_DEFAULT, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
228 c->nch, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
229 s->expect_len / 2, 2); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
230 len = avcodec_encode_audio(s->lavc_actx,dest,destsize,(void *)src); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
231 src += s->expect_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
232 left -= s->expect_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
233 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
234 af_msg(AF_MSG_DEBUG0, "avcodec_encode_audio got %d, pending %d.\n", |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
235 len, s->pending_len); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
236 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
237 if (s->add_iec61937_header) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
238 int16_t *out = (int16_t *)buf; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
239 int bsmod = dest[5] & 0x7; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
240 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
241 #ifndef WORDS_BIGENDIAN |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
242 int i; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
243 char tmp; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
244 for (i = 0; i < len; i += 2) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
245 tmp = dest[i]; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
246 dest[i] = dest[i+1]; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
247 dest[i+1] = tmp; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
248 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
249 if (len & 1) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
250 dest[len] = dest[len-1]; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
251 dest[len-1] = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
252 len++; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
253 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
254 #endif |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
255 out[0] = 0xF872; // iec 61937 syncword 1 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
256 out[1] = 0x4E1F; // iec 61937 syncword 2 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
257 out[2] = 0x0001; // data-type ac3 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
258 out[2] |= bsmod << 8; // bsmod |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
259 out[3] = len << 3; // number of bits in payload |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
260 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
261 memset(buf + 8 + len, 0, AC3_FRAME_SIZE * 2 * 2 - 8 - len); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
262 len = AC3_FRAME_SIZE * 2 * 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
263 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
264 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
265 outsize += len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
266 buf += len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
267 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
268 c->audio = l->audio; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
269 c->nch = 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
270 c->bps = 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
271 c->len = outsize; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
272 af_msg(AF_MSG_DEBUG0, "play return size %d, pending %d\n", |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
273 outsize, s->pending_len); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
274 return c; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
275 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
276 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
277 static int af_open(af_instance_t* af){ |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
278 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
279 af_ac3enc_t *s = calloc(1,sizeof(af_ac3enc_t)); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
280 int pending_space = 2 * AC3_MAX_CHANNELS * AC3_FRAME_SIZE; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
281 s->pending_data = calloc(pending_space, sizeof(char)); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
282 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
283 af->control=control; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
284 af->uninit=uninit; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
285 af->play=play; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
286 af->mul=1; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
287 af->data=calloc(1,sizeof(af_data_t)); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
288 af->setup=s; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
289 |
25962 | 290 if (!avcodec_initialized){ |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
291 avcodec_init(); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
292 avcodec_register_all(); |
25962 | 293 avcodec_initialized=1; |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
294 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
295 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
296 s->lavc_acodec = avcodec_find_encoder_by_name("ac3"); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
297 if (!s->lavc_acodec) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
298 af_msg(AF_MSG_ERROR, MSGTR_LavcAudioCodecNotFound, "ac3"); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
299 return AF_ERROR; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
300 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
301 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
302 s->lavc_actx = avcodec_alloc_context(); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
303 if (!s->lavc_actx) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
304 af_msg(AF_MSG_ERROR, MSGTR_CouldntAllocateLavcContext); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
305 return AF_ERROR; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
306 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
307 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
308 return AF_OK; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
309 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
310 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
311 af_info_t af_info_lavcac3enc = { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
312 "runtime encode to ac3 using libavcodec", |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
313 "lavcac3enc", |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
314 "Ulion", |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
315 "", |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
316 AF_FLAGS_REENTRANT, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
317 af_open |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
318 }; |