Mercurial > mplayer.hg
annotate libmpcodecs/ae_pcm.c @ 26625:5b89b42f6d50
Only compile and use libmpeg2 AltiVec code when AltiVec is available. The
AltiVec code needs -maltivec to compile, but then AltiVec instructions
appear in other places of the code causing MPlayer to sigill.
Somehow upstream libmpeg2 manages not to sigill under what appear to be
the same circumstances. Enlightenment welcome.
author | diego |
---|---|
date | Sat, 03 May 2008 15:23:22 +0000 |
parents | dfa8a510c81c |
children | 0f1b5b68af32 |
rev | line source |
---|---|
15234 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <inttypes.h> | |
15238 | 4 #include <unistd.h> |
15234 | 5 #include <string.h> |
15240 | 6 #include <sys/types.h> |
15234 | 7 #include "m_option.h" |
17012 | 8 #include "mp_msg.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
9 #include "libmpdemux/aviheader.h" |
17012 | 10 #include "libaf/af_format.h" |
25315
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
22601
diff
changeset
|
11 #include "libaf/reorder_ch.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
12 #include "libmpdemux/ms_hdr.h" |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
21660
diff
changeset
|
13 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
14 #include "libmpdemux/muxer.h" |
15234 | 15 #include "ae_pcm.h" |
16 | |
17 | |
18 static int bind_pcm(audio_encoder_t *encoder, muxer_stream_t *mux_a) | |
19 { | |
20 mux_a->h.dwScale=1; | |
21 mux_a->h.dwRate=encoder->params.sample_rate; | |
22 mux_a->wf=malloc(sizeof(WAVEFORMATEX)); | |
23 mux_a->wf->wFormatTag=0x1; // PCM | |
24 mux_a->wf->nChannels=encoder->params.channels; | |
25 mux_a->h.dwSampleSize=2*mux_a->wf->nChannels; | |
26 mux_a->wf->nBlockAlign=mux_a->h.dwSampleSize; | |
27 mux_a->wf->nSamplesPerSec=mux_a->h.dwRate; | |
28 mux_a->wf->nAvgBytesPerSec=mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec; | |
29 mux_a->wf->wBitsPerSample=16; | |
30 mux_a->wf->cbSize=0; // FIXME for l3codeca.acm | |
31 | |
32 encoder->input_format = (mux_a->wf->wBitsPerSample==8) ? AF_FORMAT_U8 : AF_FORMAT_S16_LE; | |
33 encoder->min_buffer_size = 16384; | |
34 encoder->max_buffer_size = mux_a->wf->nAvgBytesPerSec; | |
35 | |
36 return 1; | |
37 } | |
38 | |
39 static int encode_pcm(audio_encoder_t *encoder, uint8_t *dest, void *src, int nsamples, int max_size) | |
40 { | |
21531
a90aa203186c
Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents:
17012
diff
changeset
|
41 max_size = FFMIN(nsamples, max_size); |
25315
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
22601
diff
changeset
|
42 if (encoder->params.channels == 6 || encoder->params.channels == 5) { |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
22601
diff
changeset
|
43 max_size -= max_size % (encoder->params.channels * 2); |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
22601
diff
changeset
|
44 reorder_channel_copy_nch(src, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
22601
diff
changeset
|
45 dest, AF_CHANNEL_LAYOUT_WAVEEX_DEFAULT, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
22601
diff
changeset
|
46 encoder->params.channels, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
22601
diff
changeset
|
47 max_size / 2, 2); |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
22601
diff
changeset
|
48 } |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
22601
diff
changeset
|
49 else |
15234 | 50 memcpy(dest, src, max_size); |
51 return max_size; | |
52 } | |
53 | |
15258 | 54 static int set_decoded_len(audio_encoder_t *encoder, int len) |
15234 | 55 { |
15258 | 56 return len; |
15234 | 57 } |
58 | |
59 static int close_pcm(audio_encoder_t *encoder) | |
60 { | |
61 return 1; | |
62 } | |
63 | |
64 static int get_frame_size(audio_encoder_t *encoder) | |
65 { | |
66 return 0; | |
67 } | |
68 | |
69 int mpae_init_pcm(audio_encoder_t *encoder) | |
70 { | |
71 encoder->params.samples_per_frame = encoder->params.sample_rate; | |
72 encoder->params.bitrate = encoder->params.sample_rate * encoder->params.channels * 2 * 8; | |
73 | |
74 encoder->decode_buffer_size = encoder->params.bitrate / 8; | |
75 encoder->bind = bind_pcm; | |
76 encoder->get_frame_size = get_frame_size; | |
77 encoder->set_decoded_len = set_decoded_len; | |
78 encoder->encode = encode_pcm; | |
79 encoder->close = close_pcm; | |
80 | |
81 return 1; | |
82 } | |
83 |