Mercurial > mplayer.hg
annotate libaf/af_lavcac3enc.c @ 35467:364387ae95f4
Fix bug with stop button and playlist.
Although the current file was stopped and its information still
displayed, play would skip to next file in list. Now, the file
stopped can be resumed.
author | ib |
---|---|
date | Sun, 02 Dec 2012 15:56:19 +0000 |
parents | 4e7cc799cf54 |
children | d206960484fe |
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" |
34174
a93891202051
Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents:
33871
diff
changeset
|
31 #include "mp_msg.h" |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
32 #include "reorder_ch.h" |
33871
30f5e5cd3676
Move code for setting up libav* logging callbacks from vd_ffmpeg to a
reimar
parents:
33198
diff
changeset
|
33 #include "av_helpers.h" |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
34 |
26120 | 35 #include "libavcodec/avcodec.h" |
30243
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
36 #include "libavutil/intreadwrite.h" |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
37 |
34652
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
38 #define AC3_MAX_CHANNELS 6 |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
39 #define AC3_FRAME_SIZE 1536 |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
40 #define AC3_MAX_CODED_FRAME_SIZE 3840 |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
41 //#define AC3_BIT_RATES_COUNT 19 |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
42 |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
43 static const int ac3_bit_rates[] = { |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
44 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
45 192000, 224000, 256000, 320000, 384000, 448000, 512000, 576000, 640000 |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
46 }; |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
47 |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
48 // 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
|
49 typedef struct af_ac3enc_s { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
50 struct AVCodec *lavc_acodec; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
51 struct AVCodecContext *lavc_actx; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
52 int add_iec61937_header; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
53 int bit_rate; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
54 char *pending_data; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
55 int pending_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
56 int expect_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
57 int min_channel_num; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
58 } af_ac3enc_t; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
59 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
60 // Initialization and runtime control |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
61 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
|
62 { |
34260 | 63 af_ac3enc_t *s = af->setup; |
64 af_data_t *data = arg; | |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
65 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
|
66 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
|
67 {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
|
68 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
69 switch (cmd){ |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
70 case AF_CONTROL_REINIT: |
30241
02b9c1a452e1
Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents:
29491
diff
changeset
|
71 if (AF_FORMAT_IS_AC3(data->format) || data->nch < s->min_channel_num) |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
72 return AF_DETACH; |
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 s->pending_len = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
75 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
|
76 if (s->add_iec61937_header) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
77 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
|
78 else |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
79 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
|
80 |
29049 | 81 mp_msg(MSGT_AFILTER, MSGL_DBG2, "af_lavcac3enc reinit: %d, %d, %f, %d.\n", |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
82 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
|
83 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
84 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
|
85 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
|
86 af->data->rate = data->rate; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
87 else |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
88 af->data->rate = 48000; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
89 if (data->nch > AC3_MAX_CHANNELS) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
90 af->data->nch = AC3_MAX_CHANNELS; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
91 else |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
92 af->data->nch = data->nch; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
93 af->data->bps = 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
94 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
|
95 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
96 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
|
97 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
98 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
|
99 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
|
100 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
|
101 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
102 if (s->lavc_actx->codec) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
103 avcodec_close(s->lavc_actx); |
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 // Put sample parameters |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
106 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
|
107 s->lavc_actx->sample_rate = af->data->rate; |
33109 | 108 s->lavc_actx->sample_fmt = AV_SAMPLE_FMT_S16; |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
109 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
|
110 |
34566
f3d53cd55376
Update deprecated avcodec_alloc_context()/avcodec_open() API calls
siretart
parents:
34260
diff
changeset
|
111 if(avcodec_open2(s->lavc_actx, s->lavc_acodec, NULL) < 0) { |
33198 | 112 mp_msg(MSGT_AFILTER, MSGL_ERR, MSGTR_CouldntOpenCodec, "ac3", bit_rate); |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
113 return AF_ERROR; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
114 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
115 } |
30243
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
116 af->data->format = AF_FORMAT_AC3_BE; |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
117 af->data->nch = 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
118 return test_output_res; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
119 case AF_CONTROL_COMMAND_LINE: |
29049 | 120 mp_msg(MSGT_AFILTER, MSGL_DBG2, "af_lavcac3enc cmdline: %s.\n", (char*)arg); |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
121 s->bit_rate = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
122 s->min_channel_num = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
123 s->add_iec61937_header = 0; |
34260 | 124 sscanf(arg,"%d:%d:%d", &s->add_iec61937_header, &s->bit_rate, |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
125 &s->min_channel_num); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
126 if (s->bit_rate < 1000) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
127 s->bit_rate *= 1000; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
128 if (s->bit_rate) { |
34652
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
129 for (i = 0; i < FF_ARRAY_ELEMS(ac3_bit_rates); ++i) |
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
130 if (ac3_bit_rates[i] == s->bit_rate) |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
131 break; |
34652
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34566
diff
changeset
|
132 if (i >= FF_ARRAY_ELEMS(ac3_bit_rates)) { |
29049 | 133 mp_msg(MSGT_AFILTER, MSGL_WARN, "af_lavcac3enc unable set unsupported " |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
134 "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
|
135 "supported bitrates).\n", s->bit_rate); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
136 s->bit_rate = 0; |
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 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
139 if (s->min_channel_num == 0) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
140 s->min_channel_num = 5; |
29049 | 141 mp_msg(MSGT_AFILTER, MSGL_V, "af_lavcac3enc config spdif:%d, bitrate:%d, " |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
142 "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
|
143 s->min_channel_num); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
144 return AF_OK; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
145 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
146 return AF_UNKNOWN; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
147 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
148 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
149 // Deallocate memory |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
150 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
|
151 { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
152 if (af->data) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
153 free(af->data->audio); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
154 free(af->data); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
155 if (af->setup) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
156 af_ac3enc_t *s = af->setup; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
157 af->setup = NULL; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
158 if(s->lavc_actx) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
159 if (s->lavc_actx->codec) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
160 avcodec_close(s->lavc_actx); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
161 free(s->lavc_actx); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
162 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
163 free(s->pending_data); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
164 free(s); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
165 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
166 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
167 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
168 // Filter data through filter |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
169 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
|
170 { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
171 af_ac3enc_t *s = af->setup; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
172 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
|
173 af_data_t *l; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
174 int len, left, outsize = 0, destsize; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
175 char *buf, *src, *dest; |
25642
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
176 int max_output_len; |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
177 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
|
178 |
25642
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
179 if (s->add_iec61937_header) |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
180 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
|
181 else |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
182 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
|
183 |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
184 if (af->data->len < max_output_len) { |
29049 | 185 mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Reallocating memory in module %s, " |
25642
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
186 "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
|
187 max_output_len); |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
188 free(af->data->audio); |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
189 af->data->audio = malloc(max_output_len); |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
190 if (!af->data->audio) { |
29049 | 191 mp_msg(MSGT_AFILTER, MSGL_FATAL, "[libaf] Could not allocate memory \n"); |
25642
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
192 return NULL; |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
193 } |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
194 af->data->len = max_output_len; |
0c10c8859be8
Fix buffer overflow bug by calculate the buffer size accurately.
ulion
parents:
25357
diff
changeset
|
195 } |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
196 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
197 l = af->data; // Local data |
34260 | 198 buf = l->audio; |
199 src = c->audio; | |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
200 left = c->len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
201 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
202 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
203 while (left > 0) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
204 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
|
205 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
|
206 src += left; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
207 s->pending_len += left; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
208 left = 0; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
209 break; |
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 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
|
213 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
|
214 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
215 if (s->pending_len) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
216 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
|
217 if (needs > 0) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
218 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
|
219 src += needs; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
220 left -= needs; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
221 } |
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 if (c->nch >= 5) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
224 reorder_channel_nch(s->pending_data, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
225 AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, |
29491
99eda963d27a
Fix incorrect channel ordering for lavc audio codecs (specifically ffac3,
tack
parents:
29401
diff
changeset
|
226 AF_CHANNEL_LAYOUT_LAVC_DEFAULT, |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
227 c->nch, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
228 s->expect_len / 2, 2); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
229 |
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, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
231 (void *)s->pending_data); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
232 s->pending_len = 0; |
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 else { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
235 if (c->nch >= 5) |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
236 reorder_channel_nch(src, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
237 AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, |
29491
99eda963d27a
Fix incorrect channel ordering for lavc audio codecs (specifically ffac3,
tack
parents:
29401
diff
changeset
|
238 AF_CHANNEL_LAYOUT_LAVC_DEFAULT, |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
239 c->nch, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
240 s->expect_len / 2, 2); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
241 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
|
242 src += s->expect_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
243 left -= s->expect_len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
244 } |
29049 | 245 mp_msg(MSGT_AFILTER, MSGL_DBG2, "avcodec_encode_audio got %d, pending %d.\n", |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
246 len, s->pending_len); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
247 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
248 if (s->add_iec61937_header) { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
249 int bsmod = dest[5] & 0x7; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
250 |
30243
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
251 AV_WB16(buf, 0xF872); // iec 61937 syncword 1 |
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
252 AV_WB16(buf + 2, 0x4E1F); // iec 61937 syncword 2 |
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
253 buf[4] = bsmod; // bsmod |
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
254 buf[5] = 0x01; // data-type ac3 |
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
255 AV_WB16(buf + 6, len << 3); // number of bits in payload |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
256 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
257 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
|
258 len = AC3_FRAME_SIZE * 2 * 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
259 } |
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 outsize += len; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
262 buf += len; |
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 c->audio = l->audio; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
265 c->nch = 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
266 c->bps = 2; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
267 c->len = outsize; |
29049 | 268 mp_msg(MSGT_AFILTER, MSGL_DBG2, "play return size %d, pending %d\n", |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
269 outsize, s->pending_len); |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
270 return c; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
271 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
272 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
273 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
|
274 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
275 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
|
276 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
|
277 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
|
278 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
279 af->control=control; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
280 af->uninit=uninit; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
281 af->play=play; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
282 af->mul=1; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
283 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
|
284 af->setup=s; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
285 |
31960
1ba5eef167aa
Refactor more instances of avcodec_initialized handling into init_avcodec().
diego
parents:
30243
diff
changeset
|
286 init_avcodec(); |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
287 |
32695
5f69ed383ff1
Fix -af lavcac3enc after float ac3 encoder was made default in libavcodec.
cehoyos
parents:
31960
diff
changeset
|
288 s->lavc_acodec = avcodec_find_encoder_by_name("ac3_fixed"); |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
289 if (!s->lavc_acodec) { |
32695
5f69ed383ff1
Fix -af lavcac3enc after float ac3 encoder was made default in libavcodec.
cehoyos
parents:
31960
diff
changeset
|
290 mp_msg(MSGT_AFILTER, MSGL_ERR, MSGTR_LavcAudioCodecNotFound, "ac3_fixed"); |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
291 return AF_ERROR; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
292 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
293 |
34566
f3d53cd55376
Update deprecated avcodec_alloc_context()/avcodec_open() API calls
siretart
parents:
34260
diff
changeset
|
294 s->lavc_actx = avcodec_alloc_context3(NULL); |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
295 if (!s->lavc_actx) { |
29049 | 296 mp_msg(MSGT_AFILTER, MSGL_ERR, MSGTR_CouldntAllocateLavcContext); |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
297 return AF_ERROR; |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
298 } |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
299 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
300 return AF_OK; |
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 |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
303 af_info_t af_info_lavcac3enc = { |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
304 "runtime encode to ac3 using libavcodec", |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
305 "lavcac3enc", |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
306 "Ulion", |
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 AF_FLAGS_REENTRANT, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
309 af_open |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
diff
changeset
|
310 }; |