annotate libmpcodecs/ae_lavc.c @ 18049:77a3b0d11ca5

Limit the number of entires to the amount that does fit into the chunk. the function need rewrite as it assumes quite many things that are not guaranteed by the specifications.
author iive
date Thu, 06 Apr 2006 20:04:02 +0000
parents 4b1930c9345c
children d4d72e5eea07
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>
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
7 #include "m_option.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
8 #include "mp_msg.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
9 #include "aviheader.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
10 #include "ms_hdr.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
11 #include "muxer.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
12 #include "ae_lavc.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
13 #include "help_mp.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
14 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
15 #include "libaf/af_format.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
16 #ifdef USE_LIBAVCODEC_SO
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
17 #include <ffmpeg/avcodec.h>
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
18 #else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
19 #include "libavcodec/avcodec.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
20 #endif
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
21
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
22 static AVCodec *lavc_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
23 static AVCodecContext *lavc_actx;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
24 extern char *lavc_param_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
25 extern int lavc_param_abitrate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
26 extern int lavc_param_atag;
17842
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
27 extern int lavc_param_audio_global_header;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
28 extern int avcodec_inited;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
29 static int compressed_frame_size = 0;
17354
60189cd9bbc8 added support for external libavformat
nicodvb
parents: 17096
diff changeset
30 #if defined(USE_LIBAVFORMAT) || defined(USE_LIBAVFORMAT_SO)
17096
rathann
parents: 17012
diff changeset
31 extern unsigned int codec_get_wav_tag(int id);
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);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
41 mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
42 if(lavc_actx->block_align)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
43 mux_a->h.dwSampleSize = mux_a->h.dwScale = lavc_actx->block_align;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
44 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
45 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
46 mux_a->h.dwScale = (mux_a->wf->nAvgBytesPerSec * lavc_actx->frame_size)/ mux_a->wf->nSamplesPerSec; /* for cbr */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
47
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
48 if ((mux_a->wf->nAvgBytesPerSec *
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
49 lavc_actx->frame_size) % mux_a->wf->nSamplesPerSec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
50 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
51 mux_a->h.dwScale = lavc_actx->frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
52 mux_a->h.dwRate = lavc_actx->sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
53 mux_a->h.dwSampleSize = 0; // Blocksize not constant
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
54 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
55 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
56 mux_a->h.dwSampleSize = mux_a->h.dwScale;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
57 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
58 mux_a->wf->nBlockAlign = mux_a->h.dwScale;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
59 mux_a->h.dwSuggestedBufferSize = (encoder->params.audio_preload*mux_a->wf->nAvgBytesPerSec)/1000;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
60 mux_a->h.dwSuggestedBufferSize -= mux_a->h.dwSuggestedBufferSize % mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
61
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
62 switch(lavc_param_atag)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
63 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
64 case 0x11: /* imaadpcm */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
65 mux_a->wf->wBitsPerSample = 4;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
66 mux_a->wf->cbSize = 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
67 ((uint16_t*)mux_a->wf)[sizeof(WAVEFORMATEX)] =
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
68 ((lavc_actx->block_align - 4 * lavc_actx->channels) / (4 * lavc_actx->channels)) * 8 + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
69 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
70 case 0x55: /* mp3 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
71 mux_a->wf->cbSize = 12;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
72 mux_a->wf->wBitsPerSample = 0; /* does not apply */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
73 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
74 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
75 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
76 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
77 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
78 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
79 default:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
80 mux_a->wf->wBitsPerSample = 0; /* Unknown */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
81 if (lavc_actx->extradata && (lavc_actx->extradata_size > 0))
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
82 {
15501
7cdc07507650 wrong memcpy of extradata; 10l to whomever wrote that broken code
nicodvb
parents: 15244
diff changeset
83 memcpy(mux_a->wf+1, lavc_actx->extradata, lavc_actx->extradata_size);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
84 mux_a->wf->cbSize = lavc_actx->extradata_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
85 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
86 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
87 mux_a->wf->cbSize = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
88 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
89 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
90
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
91 // Fix allocation
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
92 mux_a->wf = realloc(mux_a->wf, sizeof(WAVEFORMATEX)+mux_a->wf->cbSize);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
93
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
94 encoder->input_format = AF_FORMAT_S16_NE;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
95 encoder->min_buffer_size = mux_a->h.dwSuggestedBufferSize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
96 encoder->max_buffer_size = mux_a->h.dwSuggestedBufferSize*2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
97
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
98 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
99 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
100
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
101 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
102 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
103 int n;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
104 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
105 compressed_frame_size = n;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
106 return n;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
107 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
108
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
109
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
110 static int close_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
111 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
112 compressed_frame_size = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
113 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
114 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
115
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
116 static int get_frame_size(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
117 {
17855
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
118 int sz = compressed_frame_size;
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
119 compressed_frame_size = 0;
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
120 return sz;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
121 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
122
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
123 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
124 {
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
125 if(codec == NULL)
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
126 return 0;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
127
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
128 if(! strcasecmp(codec, "mp2"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
129 return 0x50;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
130
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
131 if(! strcasecmp(codec, "mp3"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
132 return 0x55;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
133
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
134 if(! strcasecmp(codec, "ac3"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
135 return 0x2000;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
136
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
137 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
138 return 0x11;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
139
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
140 if(! strncasecmp(codec, "bonk", 4))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
141 return 0x2048;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
142
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
143 return 0;
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
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
146
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
147 int mpae_init_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
148 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
149 encoder->params.samples_per_frame = encoder->params.sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
150 encoder->params.bitrate = encoder->params.sample_rate * encoder->params.channels * 2 * 8;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
151
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
152 if(!lavc_param_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
153 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
154 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_NoLavcAudioCodecName);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
155 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
156 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
157
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
158 if(!avcodec_inited){
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
159 avcodec_init();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
160 avcodec_register_all();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
161 avcodec_inited=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
162 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
163
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
164 lavc_acodec = avcodec_find_encoder_by_name(lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
165 if (!lavc_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
166 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
167 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LavcAudioCodecNotFound, lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
168 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
169 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
170 if(lavc_param_atag == 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
171 {
17354
60189cd9bbc8 added support for external libavformat
nicodvb
parents: 17096
diff changeset
172 #if defined(USE_LIBAVFORMAT) || defined(USE_LIBAVFORMAT_SO)
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
173 lavc_param_atag = codec_get_wav_tag(lavc_acodec->id);
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
174 #else
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
175 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
176 #endif
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
177 if(!lavc_param_atag)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
178 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
179 mp_msg(MSGT_MENCODER, MSGL_FATAL, "Couldn't find wav tag for specified codec, exit\n");
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
180 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
181 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
182 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
183
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
184 lavc_actx = avcodec_alloc_context();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
185 if(lavc_actx == NULL)
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_CouldntAllocateLavcContext);
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
191 // put sample parameters
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
192 lavc_actx->channels = encoder->params.channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
193 lavc_actx->sample_rate = encoder->params.sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
194 lavc_actx->bit_rate = encoder->params.bitrate = lavc_param_abitrate * 1000;
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 /*
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
198 * Special case for adpcm_ima_wav.
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
199 * The bitrate is only dependant on samplerate.
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
200 * We have to known frame_size and block_align in advance,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
201 * so I just copied the code from libavcodec/adpcm.c
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
202 *
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
203 * However, ms adpcm_ima_wav uses a block_align of 2048,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
204 * lavc defaults to 1024
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
205 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
206 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
207 int blkalign = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
208 int framesize = (blkalign - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
209 lavc_actx->bit_rate = lavc_actx->sample_rate*8*blkalign/framesize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
210 }
17842
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
211 if((lavc_param_audio_global_header&1)
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
212 /*|| (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))*/){
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
213 lavc_actx->flags |= CODEC_FLAG_GLOBAL_HEADER;
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
214 }
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
215 if(lavc_param_audio_global_header&2){
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
216 lavc_actx->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
217 }
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
218
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
219 if(avcodec_open(lavc_actx, lavc_acodec) < 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
220 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
221 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntOpenCodec, lavc_param_acodec, lavc_param_abitrate);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
222 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
223 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
224
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
225 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
226 lavc_actx->block_align = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
227 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
228 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
229
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
230 encoder->decode_buffer_size = lavc_actx->frame_size * 2 * encoder->params.channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
231 encoder->bind = bind_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
232 encoder->get_frame_size = get_frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
233 encoder->encode = encode_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
234 encoder->close = close_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
235
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
236 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
237 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
238