annotate libmpcodecs/ae_lavc.c @ 30088:4977e04f3a18

Add support for parsing audio streams (though should be easy to extend to video) via libavcodec. Parsing can be done at the demuxer stage (currently disabled) or at the decoder (ad_ffmpeg, enabled). Should allow using the libavcodec AAC, DTS, ... decoders independent of container format.
author reimar
date Sun, 27 Dec 2009 15:28:01 +0000
parents a3cc38ad5878
children bbb6ebec87a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
1 #include <stdio.h>
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
2 #include <stdlib.h>
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
3 #include <inttypes.h>
15238
2cc48c37a7eb FreeBSD fix
nexus
parents: 15234
diff changeset
4 #include <unistd.h>
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
5 #include <string.h>
15240
6d6792c02b6f macosx compilation fix
nicodvb
parents: 15238
diff changeset
6 #include <sys/types.h>
26203
0d255d03016f #include config.h before all other headers.
diego
parents: 26069
diff changeset
7 #include "config.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
8 #include "m_option.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
9 #include "mp_msg.h"
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22600
diff changeset
10 #include "libmpdemux/aviheader.h"
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22600
diff changeset
11 #include "libmpdemux/ms_hdr.h"
22600
3c2b4a866c6a Add explicit location for headers from the stream/ directory.
diego
parents: 22316
diff changeset
12 #include "stream/stream.h"
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22600
diff changeset
13 #include "libmpdemux/muxer.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
14 #include "ae_lavc.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
15 #include "help_mp.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
16 #include "libaf/af_format.h"
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24359
diff changeset
17 #include "libaf/reorder_ch.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
18 #include "libavcodec/avcodec.h"
28132
c28c36d595d5 Fix imaadpcm extradata with lavc encoder.
reimar
parents: 27341
diff changeset
19 #include "libavutil/intreadwrite.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
20
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
21 static AVCodec *lavc_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
22 static AVCodecContext *lavc_actx;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
23 extern char *lavc_param_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
24 extern int lavc_param_abitrate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
25 extern int lavc_param_atag;
17842
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
26 extern int lavc_param_audio_global_header;
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25315
diff changeset
27 extern int avcodec_initialized;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
28 static int compressed_frame_size = 0;
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26203
diff changeset
29 #ifdef CONFIG_LIBAVFORMAT
21820
cd705f30bb31 Include libavformat/riff.h when building with static libavformat and
reimar
parents: 21773
diff changeset
30 #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
31 extern const struct AVCodecTag *mp_wav_taglists[];
17096
rathann
parents: 17012
diff changeset
32 #endif
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
33
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
34 static int bind_lavc(audio_encoder_t *encoder, muxer_stream_t *mux_a)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
35 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
36 mux_a->wf = malloc(sizeof(WAVEFORMATEX)+lavc_actx->extradata_size+256);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
37 mux_a->wf->wFormatTag = lavc_param_atag;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
38 mux_a->wf->nChannels = lavc_actx->channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
39 mux_a->wf->nSamplesPerSec = lavc_actx->sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
40 mux_a->wf->nAvgBytesPerSec = (lavc_actx->bit_rate / 8);
19360
d4d72e5eea07 pass average bitrate from encoder to (lavf) muxer
michael
parents: 17855
diff changeset
41 mux_a->avg_rate= lavc_actx->bit_rate;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
42 mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
43 if(lavc_actx->block_align)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
44 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
45 else
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
46 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
47 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
48
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
49 if ((mux_a->wf->nAvgBytesPerSec *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
50 lavc_actx->frame_size) % mux_a->wf->nSamplesPerSec)
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
51 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
52 mux_a->h.dwScale = lavc_actx->frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
53 mux_a->h.dwRate = lavc_actx->sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
54 mux_a->h.dwSampleSize = 0; // Blocksize not constant
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
55 }
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
56 else
21773
03bc990498fc the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents: 21771
diff changeset
57 mux_a->h.dwSampleSize = 0;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
58 }
21773
03bc990498fc the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents: 21771
diff changeset
59 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
60 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
61 else
03bc990498fc the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents: 21771
diff changeset
62 mux_a->wf->nBlockAlign = 1;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
63 mux_a->h.dwSuggestedBufferSize = (encoder->params.audio_preload*mux_a->wf->nAvgBytesPerSec)/1000;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
64 mux_a->h.dwSuggestedBufferSize -= mux_a->h.dwSuggestedBufferSize % mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
65
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
66 switch(lavc_param_atag)
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
67 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
68 case 0x11: /* imaadpcm */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
69 mux_a->wf->wBitsPerSample = 4;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
70 mux_a->wf->cbSize = 2;
28132
c28c36d595d5 Fix imaadpcm extradata with lavc encoder.
reimar
parents: 27341
diff changeset
71 AV_WL16(mux_a->wf+1, lavc_actx->frame_size);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
72 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
73 case 0x55: /* mp3 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
74 mux_a->wf->cbSize = 12;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
75 mux_a->wf->wBitsPerSample = 0; /* does not apply */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
76 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
77 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
78 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
79 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
80 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
81 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
82 default:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
83 mux_a->wf->wBitsPerSample = 0; /* Unknown */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
84 if (lavc_actx->extradata && (lavc_actx->extradata_size > 0))
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
85 {
15501
7cdc07507650 wrong memcpy of extradata; 10l to whomever wrote that broken code
nicodvb
parents: 15244
diff changeset
86 memcpy(mux_a->wf+1, lavc_actx->extradata, lavc_actx->extradata_size);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
87 mux_a->wf->cbSize = lavc_actx->extradata_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
88 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
89 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
90 mux_a->wf->cbSize = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
91 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
92 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
93
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
94 // Fix allocation
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
95 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
96
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
97 encoder->input_format = AF_FORMAT_S16_NE;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
98 encoder->min_buffer_size = mux_a->h.dwSuggestedBufferSize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
99 encoder->max_buffer_size = mux_a->h.dwSuggestedBufferSize*2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
100
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
101 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
102 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
103
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
104 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
105 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
106 int n;
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24359
diff changeset
107 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
108 (!strcmp(lavc_acodec->name,"ac3") ||
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24359
diff changeset
109 !strcmp(lavc_acodec->name,"libfaac"))) {
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24359
diff changeset
110 int isac3 = !strcmp(lavc_acodec->name,"ac3");
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24359
diff changeset
111 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
112 isac3 ? AF_CHANNEL_LAYOUT_LAVC_DEFAULT
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24359
diff changeset
113 : AF_CHANNEL_LAYOUT_AAC_DEFAULT,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24359
diff changeset
114 encoder->params.channels,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24359
diff changeset
115 size / 2, 2);
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24359
diff changeset
116 }
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
117 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
118 compressed_frame_size = n;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
119 return n;
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
123 static int close_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
124 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
125 compressed_frame_size = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
126 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
127 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
128
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
129 static int get_frame_size(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
130 {
17855
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
131 int sz = compressed_frame_size;
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
132 compressed_frame_size = 0;
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
133 return sz;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
134 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
135
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26203
diff changeset
136 #ifndef CONFIG_LIBAVFORMAT
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
137 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
138 {
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
139 if(codec == NULL)
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
140 return 0;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
141
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
142 if(! strcasecmp(codec, "mp2"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
143 return 0x50;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
144
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
145 if(! strcasecmp(codec, "mp3"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
146 return 0x55;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
147
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
148 if(! strcasecmp(codec, "ac3"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
149 return 0x2000;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
150
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
151 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
152 return 0x11;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
153
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
154 if(! strncasecmp(codec, "bonk", 4))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
155 return 0x2048;
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 return 0;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
158 }
24359
30b770392f2c warning fix:
diego
parents: 23957
diff changeset
159 #endif
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
160
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
161
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
162 int mpae_init_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
163 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
164 encoder->params.samples_per_frame = encoder->params.sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
165 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
166
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
167 if(!lavc_param_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
168 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
169 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_NoLavcAudioCodecName);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
170 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
171 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
172
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25315
diff changeset
173 if(!avcodec_initialized){
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
174 avcodec_init();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
175 avcodec_register_all();
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25315
diff changeset
176 avcodec_initialized=1;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
177 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
178
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
179 lavc_acodec = avcodec_find_encoder_by_name(lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
180 if (!lavc_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
181 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
182 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LavcAudioCodecNotFound, lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
183 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
184 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
185 if(lavc_param_atag == 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
186 {
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26203
diff changeset
187 #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
188 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
189 #else
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
190 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
191 #endif
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
192 if(!lavc_param_atag)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
193 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
194 mp_msg(MSGT_MENCODER, MSGL_FATAL, "Couldn't find wav tag for specified codec, exit\n");
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
195 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
196 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
197 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
198
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
199 lavc_actx = avcodec_alloc_context();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
200 if(lavc_actx == NULL)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
201 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
202 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntAllocateLavcContext);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
203 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
204 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
205
29673
a3cc38ad5878 Set codec_type and codec_id in codec context for lavc encoders.
reimar
parents: 29491
diff changeset
206 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
207 lavc_actx->codec_id = lavc_acodec->id;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
208 // put sample parameters
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
209 lavc_actx->channels = encoder->params.channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
210 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
211 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
212 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
213 if(lavc_param_abitrate<1000)
74eb6825d332 allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents: 23121
diff changeset
214 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
215 else
74eb6825d332 allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents: 23121
diff changeset
216 lavc_actx->bit_rate = encoder->params.bitrate = lavc_param_abitrate;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28928
diff changeset
217
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
218
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
219 /*
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
220 * Special case for adpcm_ima_wav.
22316
f3d7a1b58a82 cosmetics: Fix some common typos, appropiate --> appropRiate,
diego
parents: 21966
diff changeset
221 * The bitrate is only dependent on samplerate.
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
222 * We have to known frame_size and block_align in advance,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
223 * so I just copied the code from libavcodec/adpcm.c
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
224 *
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
225 * However, ms adpcm_ima_wav uses a block_align of 2048,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
226 * lavc defaults to 1024
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
227 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
228 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
229 int blkalign = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
230 int framesize = (blkalign - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
231 lavc_actx->bit_rate = lavc_actx->sample_rate*8*blkalign/framesize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
232 }
17842
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
233 if((lavc_param_audio_global_header&1)
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
234 /*|| (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))*/){
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
235 lavc_actx->flags |= CODEC_FLAG_GLOBAL_HEADER;
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
236 }
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
237 if(lavc_param_audio_global_header&2){
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
238 lavc_actx->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
239 }
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
240
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
241 if(avcodec_open(lavc_actx, lavc_acodec) < 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
242 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
243 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntOpenCodec, lavc_param_acodec, lavc_param_abitrate);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
244 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
245 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
246
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
247 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
248 lavc_actx->block_align = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
249 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
250 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
251
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
252 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
253 while (encoder->decode_buffer_size < 1024) encoder->decode_buffer_size *= 2;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
254 encoder->bind = bind_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
255 encoder->get_frame_size = get_frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
256 encoder->encode = encode_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
257 encoder->close = close_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
258
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
259 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
260 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
261