Mercurial > mplayer.hg
annotate libmpcodecs/ae_lavc.c @ 30811:50e0f6942e43
Implement Win32 mutexes.
Implement Win32 mutexes; they used to just be mapped on top of events, which
is not the same thing at all.
The implementation is pretty much the obvious one, similar to the
current critical section implementation and the semaphore implementation;
a single lock count protected by a pthread mutex, and an event lockers can
sleep on to know when the mutex is available.
Also make CreateMutexA and ReleaseMutex available even if QuickTime codecs
support is not configured.
author | sesse |
---|---|
date | Sat, 06 Mar 2010 10:13:37 +0000 |
parents | 32725ca88fed |
children | ef92321146a1 |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29673
diff
changeset
|
18 |
15234 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <inttypes.h> | |
15238 | 22 #include <unistd.h> |
15234 | 23 #include <string.h> |
15240 | 24 #include <sys/types.h> |
26203 | 25 #include "config.h" |
15234 | 26 #include "m_option.h" |
17012 | 27 #include "mp_msg.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
28 #include "libmpdemux/aviheader.h" |
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
29 #include "libmpdemux/ms_hdr.h" |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
22316
diff
changeset
|
30 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
31 #include "libmpdemux/muxer.h" |
15234 | 32 #include "ae_lavc.h" |
33 #include "help_mp.h" | |
17012 | 34 #include "libaf/af_format.h" |
25315
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
35 #include "libaf/reorder_ch.h" |
15234 | 36 #include "libavcodec/avcodec.h" |
28132 | 37 #include "libavutil/intreadwrite.h" |
15234 | 38 |
39 static AVCodec *lavc_acodec; | |
40 static AVCodecContext *lavc_actx; | |
41 extern char *lavc_param_acodec; | |
42 extern int lavc_param_abitrate; | |
43 extern int lavc_param_atag; | |
17842 | 44 extern int lavc_param_audio_global_header; |
25962 | 45 extern int avcodec_initialized; |
15234 | 46 static int compressed_frame_size = 0; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26203
diff
changeset
|
47 #ifdef CONFIG_LIBAVFORMAT |
21820
cd705f30bb31
Include libavformat/riff.h when building with static libavformat and
reimar
parents:
21773
diff
changeset
|
48 #include "libavformat/avformat.h" |
21966
d9494ca70ca7
Simplify by using av_codec_get_id and include riff.h only in demux_lavf.c
reimar
parents:
21963
diff
changeset
|
49 extern const struct AVCodecTag *mp_wav_taglists[]; |
17096 | 50 #endif |
15234 | 51 |
52 static int bind_lavc(audio_encoder_t *encoder, muxer_stream_t *mux_a) | |
53 { | |
54 mux_a->wf = malloc(sizeof(WAVEFORMATEX)+lavc_actx->extradata_size+256); | |
55 mux_a->wf->wFormatTag = lavc_param_atag; | |
56 mux_a->wf->nChannels = lavc_actx->channels; | |
57 mux_a->wf->nSamplesPerSec = lavc_actx->sample_rate; | |
58 mux_a->wf->nAvgBytesPerSec = (lavc_actx->bit_rate / 8); | |
19360
d4d72e5eea07
pass average bitrate from encoder to (lavf) muxer
michael
parents:
17855
diff
changeset
|
59 mux_a->avg_rate= lavc_actx->bit_rate; |
15234 | 60 mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec; |
61 if(lavc_actx->block_align) | |
62 mux_a->h.dwSampleSize = mux_a->h.dwScale = lavc_actx->block_align; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
63 else |
15234 | 64 { |
65 mux_a->h.dwScale = (mux_a->wf->nAvgBytesPerSec * lavc_actx->frame_size)/ mux_a->wf->nSamplesPerSec; /* for cbr */ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
66 |
15234 | 67 if ((mux_a->wf->nAvgBytesPerSec * |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
68 lavc_actx->frame_size) % mux_a->wf->nSamplesPerSec) |
15234 | 69 { |
70 mux_a->h.dwScale = lavc_actx->frame_size; | |
71 mux_a->h.dwRate = lavc_actx->sample_rate; | |
72 mux_a->h.dwSampleSize = 0; // Blocksize not constant | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
73 } |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
74 else |
21773
03bc990498fc
the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents:
21771
diff
changeset
|
75 mux_a->h.dwSampleSize = 0; |
15234 | 76 } |
21773
03bc990498fc
the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents:
21771
diff
changeset
|
77 if(mux_a->h.dwSampleSize) |
03bc990498fc
the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents:
21771
diff
changeset
|
78 mux_a->wf->nBlockAlign = mux_a->h.dwSampleSize; |
03bc990498fc
the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents:
21771
diff
changeset
|
79 else |
03bc990498fc
the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents:
21771
diff
changeset
|
80 mux_a->wf->nBlockAlign = 1; |
15234 | 81 mux_a->h.dwSuggestedBufferSize = (encoder->params.audio_preload*mux_a->wf->nAvgBytesPerSec)/1000; |
82 mux_a->h.dwSuggestedBufferSize -= mux_a->h.dwSuggestedBufferSize % mux_a->wf->nBlockAlign; | |
83 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
84 switch(lavc_param_atag) |
15234 | 85 { |
86 case 0x11: /* imaadpcm */ | |
87 mux_a->wf->wBitsPerSample = 4; | |
88 mux_a->wf->cbSize = 2; | |
28132 | 89 AV_WL16(mux_a->wf+1, lavc_actx->frame_size); |
15234 | 90 break; |
91 case 0x55: /* mp3 */ | |
92 mux_a->wf->cbSize = 12; | |
93 mux_a->wf->wBitsPerSample = 0; /* does not apply */ | |
94 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1; | |
95 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2; | |
96 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign; | |
97 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1; | |
98 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0; | |
99 break; | |
100 default: | |
101 mux_a->wf->wBitsPerSample = 0; /* Unknown */ | |
102 if (lavc_actx->extradata && (lavc_actx->extradata_size > 0)) | |
103 { | |
15501
7cdc07507650
wrong memcpy of extradata; 10l to whomever wrote that broken code
nicodvb
parents:
15244
diff
changeset
|
104 memcpy(mux_a->wf+1, lavc_actx->extradata, lavc_actx->extradata_size); |
15234 | 105 mux_a->wf->cbSize = lavc_actx->extradata_size; |
106 } | |
107 else | |
108 mux_a->wf->cbSize = 0; | |
109 break; | |
110 } | |
111 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
112 // Fix allocation |
15234 | 113 mux_a->wf = realloc(mux_a->wf, sizeof(WAVEFORMATEX)+mux_a->wf->cbSize); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
114 |
15234 | 115 encoder->input_format = AF_FORMAT_S16_NE; |
116 encoder->min_buffer_size = mux_a->h.dwSuggestedBufferSize; | |
117 encoder->max_buffer_size = mux_a->h.dwSuggestedBufferSize*2; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
118 |
15234 | 119 return 1; |
120 } | |
121 | |
122 static int encode_lavc(audio_encoder_t *encoder, uint8_t *dest, void *src, int size, int max_size) | |
123 { | |
124 int n; | |
25315
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
125 if ((encoder->params.channels == 6 || encoder->params.channels == 5) && |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
126 (!strcmp(lavc_acodec->name,"ac3") || |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
127 !strcmp(lavc_acodec->name,"libfaac"))) { |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
128 int isac3 = !strcmp(lavc_acodec->name,"ac3"); |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
129 reorder_channel_nch(src, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, |
29491
99eda963d27a
Fix incorrect channel ordering for lavc audio codecs (specifically ffac3,
tack
parents:
29263
diff
changeset
|
130 isac3 ? AF_CHANNEL_LAYOUT_LAVC_DEFAULT |
25315
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
131 : AF_CHANNEL_LAYOUT_AAC_DEFAULT, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
132 encoder->params.channels, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
133 size / 2, 2); |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24359
diff
changeset
|
134 } |
15234 | 135 n = avcodec_encode_audio(lavc_actx, dest, size, src); |
17855
4b1930c9345c
do not randomly chop up packets, this isnt allowed in almost no container
michael
parents:
17842
diff
changeset
|
136 compressed_frame_size = n; |
15234 | 137 return n; |
138 } | |
139 | |
140 | |
141 static int close_lavc(audio_encoder_t *encoder) | |
142 { | |
143 compressed_frame_size = 0; | |
144 return 1; | |
145 } | |
146 | |
147 static int get_frame_size(audio_encoder_t *encoder) | |
148 { | |
17855
4b1930c9345c
do not randomly chop up packets, this isnt allowed in almost no container
michael
parents:
17842
diff
changeset
|
149 int sz = compressed_frame_size; |
4b1930c9345c
do not randomly chop up packets, this isnt allowed in almost no container
michael
parents:
17842
diff
changeset
|
150 compressed_frame_size = 0; |
4b1930c9345c
do not randomly chop up packets, this isnt allowed in almost no container
michael
parents:
17842
diff
changeset
|
151 return sz; |
15234 | 152 } |
153 | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26203
diff
changeset
|
154 #ifndef CONFIG_LIBAVFORMAT |
15244
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
155 static uint32_t lavc_find_atag(char *codec) |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
156 { |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
157 if(codec == NULL) |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
158 return 0; |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
159 |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
160 if(! strcasecmp(codec, "mp2")) |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
161 return 0x50; |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
162 |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
163 if(! strcasecmp(codec, "mp3")) |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
164 return 0x55; |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
165 |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
166 if(! strcasecmp(codec, "ac3")) |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
167 return 0x2000; |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
168 |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
169 if(! strcasecmp(codec, "adpcm_ima_wav")) |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
170 return 0x11; |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
171 |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
172 if(! strncasecmp(codec, "bonk", 4)) |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
173 return 0x2048; |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
174 |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
175 return 0; |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
176 } |
24359 | 177 #endif |
15244
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
178 |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
179 |
15234 | 180 int mpae_init_lavc(audio_encoder_t *encoder) |
181 { | |
182 encoder->params.samples_per_frame = encoder->params.sample_rate; | |
183 encoder->params.bitrate = encoder->params.sample_rate * encoder->params.channels * 2 * 8; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
184 |
15234 | 185 if(!lavc_param_acodec) |
186 { | |
187 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_NoLavcAudioCodecName); | |
188 return 0; | |
189 } | |
190 | |
25962 | 191 if(!avcodec_initialized){ |
15234 | 192 avcodec_init(); |
193 avcodec_register_all(); | |
25962 | 194 avcodec_initialized=1; |
15234 | 195 } |
196 | |
197 lavc_acodec = avcodec_find_encoder_by_name(lavc_param_acodec); | |
198 if (!lavc_acodec) | |
199 { | |
200 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LavcAudioCodecNotFound, lavc_param_acodec); | |
201 return 0; | |
202 } | |
203 if(lavc_param_atag == 0) | |
204 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26203
diff
changeset
|
205 #ifdef CONFIG_LIBAVFORMAT |
21966
d9494ca70ca7
Simplify by using av_codec_get_id and include riff.h only in demux_lavf.c
reimar
parents:
21963
diff
changeset
|
206 lavc_param_atag = av_codec_get_tag(mp_wav_taglists, lavc_acodec->id); |
15244
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
207 #else |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
208 lavc_param_atag = lavc_find_atag(lavc_param_acodec); |
a8a8a4d69a1c
restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents:
15240
diff
changeset
|
209 #endif |
15234 | 210 if(!lavc_param_atag) |
211 { | |
212 mp_msg(MSGT_MENCODER, MSGL_FATAL, "Couldn't find wav tag for specified codec, exit\n"); | |
213 return 0; | |
214 } | |
215 } | |
216 | |
217 lavc_actx = avcodec_alloc_context(); | |
218 if(lavc_actx == NULL) | |
219 { | |
220 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntAllocateLavcContext); | |
221 return 0; | |
222 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
223 |
29673
a3cc38ad5878
Set codec_type and codec_id in codec context for lavc encoders.
reimar
parents:
29491
diff
changeset
|
224 lavc_actx->codec_type = CODEC_TYPE_AUDIO; |
a3cc38ad5878
Set codec_type and codec_id in codec context for lavc encoders.
reimar
parents:
29491
diff
changeset
|
225 lavc_actx->codec_id = lavc_acodec->id; |
15234 | 226 // put sample parameters |
227 lavc_actx->channels = encoder->params.channels; | |
228 lavc_actx->sample_rate = encoder->params.sample_rate; | |
28660
0812215421d7
Set time_base to 1/samplerate, like FFmpeg does, instead of leaving it at the
diego
parents:
28132
diff
changeset
|
229 lavc_actx->time_base.num = 1; |
0812215421d7
Set time_base to 1/samplerate, like FFmpeg does, instead of leaving it at the
diego
parents:
28132
diff
changeset
|
230 lavc_actx->time_base.den = encoder->params.sample_rate; |
23957
74eb6825d332
allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents:
23121
diff
changeset
|
231 if(lavc_param_abitrate<1000) |
74eb6825d332
allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents:
23121
diff
changeset
|
232 lavc_actx->bit_rate = encoder->params.bitrate = lavc_param_abitrate * 1000; |
74eb6825d332
allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents:
23121
diff
changeset
|
233 else |
74eb6825d332
allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents:
23121
diff
changeset
|
234 lavc_actx->bit_rate = encoder->params.bitrate = lavc_param_abitrate; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28928
diff
changeset
|
235 |
15234 | 236 |
237 /* | |
238 * Special case for adpcm_ima_wav. | |
22316
f3d7a1b58a82
cosmetics: Fix some common typos, appropiate --> appropRiate,
diego
parents:
21966
diff
changeset
|
239 * The bitrate is only dependent on samplerate. |
15234 | 240 * We have to known frame_size and block_align in advance, |
241 * so I just copied the code from libavcodec/adpcm.c | |
242 * | |
243 * However, ms adpcm_ima_wav uses a block_align of 2048, | |
244 * lavc defaults to 1024 | |
245 */ | |
246 if(lavc_param_atag == 0x11) { | |
247 int blkalign = 2048; | |
248 int framesize = (blkalign - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1; | |
249 lavc_actx->bit_rate = lavc_actx->sample_rate*8*blkalign/framesize; | |
250 } | |
17842 | 251 if((lavc_param_audio_global_header&1) |
252 /*|| (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))*/){ | |
253 lavc_actx->flags |= CODEC_FLAG_GLOBAL_HEADER; | |
254 } | |
255 if(lavc_param_audio_global_header&2){ | |
256 lavc_actx->flags2 |= CODEC_FLAG2_LOCAL_HEADER; | |
257 } | |
15234 | 258 |
259 if(avcodec_open(lavc_actx, lavc_acodec) < 0) | |
260 { | |
261 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntOpenCodec, lavc_param_acodec, lavc_param_abitrate); | |
262 return 0; | |
263 } | |
264 | |
265 if(lavc_param_atag == 0x11) { | |
266 lavc_actx->block_align = 2048; | |
267 lavc_actx->frame_size = (lavc_actx->block_align - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1; | |
268 } | |
269 | |
270 encoder->decode_buffer_size = lavc_actx->frame_size * 2 * encoder->params.channels; | |
28928
f2b3f28982b8
Avoid ridiculously small decode_buffer_size (e.g. 4 with acodec=pcm_s16le)
reimar
parents:
28660
diff
changeset
|
271 while (encoder->decode_buffer_size < 1024) encoder->decode_buffer_size *= 2; |
15234 | 272 encoder->bind = bind_lavc; |
273 encoder->get_frame_size = get_frame_size; | |
274 encoder->encode = encode_lavc; | |
275 encoder->close = close_lavc; | |
276 | |
277 return 1; | |
278 } |