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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
19 #include <stdio.h>
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
20 #include <stdlib.h>
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
21 #include <inttypes.h>
15238
2cc48c37a7eb FreeBSD fix
nexus
parents: 15234
diff changeset
22 #include <unistd.h>
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
23 #include <string.h>
15240
6d6792c02b6f macosx compilation fix
nicodvb
parents: 15238
diff changeset
24 #include <sys/types.h>
26203
0d255d03016f #include config.h before all other headers.
diego
parents: 26069
diff changeset
25 #include "config.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
26 #include "m_option.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
32 #include "ae_lavc.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
33 #include "help_mp.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
36 #include "libavcodec/avcodec.h"
28132
c28c36d595d5 Fix imaadpcm extradata with lavc encoder.
reimar
parents: 27341
diff changeset
37 #include "libavutil/intreadwrite.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
38
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
39 static AVCodec *lavc_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
40 static AVCodecContext *lavc_actx;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
41 extern char *lavc_param_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
42 extern int lavc_param_abitrate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
43 extern int lavc_param_atag;
17842
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
44 extern int lavc_param_audio_global_header;
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25315
diff changeset
45 extern int avcodec_initialized;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
rathann
parents: 17012
diff changeset
50 #endif
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
51
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
52 static int bind_lavc(audio_encoder_t *encoder, muxer_stream_t *mux_a)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
53 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
54 mux_a->wf = malloc(sizeof(WAVEFORMATEX)+lavc_actx->extradata_size+256);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
55 mux_a->wf->wFormatTag = lavc_param_atag;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
56 mux_a->wf->nChannels = lavc_actx->channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
57 mux_a->wf->nSamplesPerSec = lavc_actx->sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
60 mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
61 if(lavc_actx->block_align)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
64 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
69 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
70 mux_a->h.dwScale = lavc_actx->frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
71 mux_a->h.dwRate = lavc_actx->sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
81 mux_a->h.dwSuggestedBufferSize = (encoder->params.audio_preload*mux_a->wf->nAvgBytesPerSec)/1000;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
82 mux_a->h.dwSuggestedBufferSize -= mux_a->h.dwSuggestedBufferSize % mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
83
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
84 switch(lavc_param_atag)
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
85 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
86 case 0x11: /* imaadpcm */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
87 mux_a->wf->wBitsPerSample = 4;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
88 mux_a->wf->cbSize = 2;
28132
c28c36d595d5 Fix imaadpcm extradata with lavc encoder.
reimar
parents: 27341
diff changeset
89 AV_WL16(mux_a->wf+1, lavc_actx->frame_size);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
90 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
91 case 0x55: /* mp3 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
92 mux_a->wf->cbSize = 12;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
93 mux_a->wf->wBitsPerSample = 0; /* does not apply */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
94 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
95 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
96 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
97 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
98 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
99 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
100 default:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
101 mux_a->wf->wBitsPerSample = 0; /* Unknown */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
102 if (lavc_actx->extradata && (lavc_actx->extradata_size > 0))
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
105 mux_a->wf->cbSize = lavc_actx->extradata_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
106 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
107 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
108 mux_a->wf->cbSize = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
109 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
110 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
111
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
112 // Fix allocation
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
115 encoder->input_format = AF_FORMAT_S16_NE;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
116 encoder->min_buffer_size = mux_a->h.dwSuggestedBufferSize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
119 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
120 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
121
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
122 static int encode_lavc(audio_encoder_t *encoder, uint8_t *dest, void *src, int size, int max_size)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
123 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
137 return n;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
138 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
139
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
140
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
141 static int close_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
142 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
143 compressed_frame_size = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
144 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
145 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
146
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
147 static int get_frame_size(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
152 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
30b770392f2c warning fix:
diego
parents: 23957
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
180 int mpae_init_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
181 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
182 encoder->params.samples_per_frame = encoder->params.sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
185 if(!lavc_param_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
186 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
187 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_NoLavcAudioCodecName);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
188 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
189 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
190
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25315
diff changeset
191 if(!avcodec_initialized){
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
192 avcodec_init();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
193 avcodec_register_all();
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25315
diff changeset
194 avcodec_initialized=1;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
195 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
196
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
197 lavc_acodec = avcodec_find_encoder_by_name(lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
198 if (!lavc_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
199 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
200 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LavcAudioCodecNotFound, lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
201 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
202 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
203 if(lavc_param_atag == 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
210 if(!lavc_param_atag)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
211 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
212 mp_msg(MSGT_MENCODER, MSGL_FATAL, "Couldn't find wav tag for specified codec, exit\n");
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
213 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
214 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
215 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
216
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
217 lavc_actx = avcodec_alloc_context();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
218 if(lavc_actx == NULL)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
219 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
220 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntAllocateLavcContext);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
221 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
226 // put sample parameters
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
227 lavc_actx->channels = encoder->params.channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
236
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
237 /*
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
240 * We have to known frame_size and block_align in advance,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
241 * so I just copied the code from libavcodec/adpcm.c
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
242 *
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
243 * However, ms adpcm_ima_wav uses a block_align of 2048,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
244 * lavc defaults to 1024
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
245 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
246 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
247 int blkalign = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
248 int framesize = (blkalign - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
249 lavc_actx->bit_rate = lavc_actx->sample_rate*8*blkalign/framesize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
250 }
17842
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
251 if((lavc_param_audio_global_header&1)
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
252 /*|| (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))*/){
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
253 lavc_actx->flags |= CODEC_FLAG_GLOBAL_HEADER;
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
254 }
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
255 if(lavc_param_audio_global_header&2){
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
256 lavc_actx->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
257 }
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
258
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
259 if(avcodec_open(lavc_actx, lavc_acodec) < 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
260 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
261 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntOpenCodec, lavc_param_acodec, lavc_param_abitrate);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
262 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
263 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
264
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
265 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
266 lavc_actx->block_align = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
267 lavc_actx->frame_size = (lavc_actx->block_align - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
268 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
269
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
272 encoder->bind = bind_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
273 encoder->get_frame_size = get_frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
274 encoder->encode = encode_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
275 encoder->close = close_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
276
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
277 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
278 }