r665: Merged the official release 2.0.
[cinelerra_cv.git] / libmpeg3 / audio / ac3.c
blob94c840469cc54a79d73e69dacf44fefa862e0088
1 #include <stdint.h>
2 #include <stdio.h>
4 #include <a52dec/a52.h>
5 #include "mpeg3private.h"
6 #include "mpeg3protos.h"
8 #include <string.h>
11 mpeg3_ac3_t* mpeg3_new_ac3()
13 mpeg3_ac3_t *result = calloc(1, sizeof(mpeg3_ac3_t));
14 result->stream = mpeg3bits_new_stream(0, 0);
15 result->state = a52_init(0);
16 result->output = a52_samples(result->state);
17 return result;
20 void mpeg3_delete_ac3(mpeg3_ac3_t *audio)
22 mpeg3bits_delete_stream(audio->stream);
23 a52_free(audio->state);
24 free(audio);
28 /* Return 1 if it isn't an AC3 header */
29 int mpeg3_ac3_check(unsigned char *header)
31 int flags, samplerate, bitrate;
32 return !a52_syncinfo(header,
33 &flags,
34 &samplerate,
35 &bitrate);
38 /* Decode AC3 header */
39 int mpeg3_ac3_header(mpeg3_ac3_t *audio, unsigned char *header)
41 int result = 0;
42 audio->flags = 0;
44 //printf("mpeg3_ac3_header %02x%02x%02x%02x%02x%02x%02x%02x\n", header[0], header[1], header[2], header[3], header[4], header[5], header[6], header[7]);
45 result = a52_syncinfo(header,
46 &audio->flags,
47 &audio->samplerate,
48 &audio->bitrate);
51 if(result)
53 //printf("%d\n", result);
54 audio->framesize = result;
55 audio->channels = 0;
57 if(audio->flags & A52_LFE)
58 audio->channels++;
59 //printf("mpeg3_ac3_header %02x %02x\n", audio->flags & A52_LFE, audio->flags & A52_CHANNEL_MASK);
60 switch(audio->flags & A52_CHANNEL_MASK)
62 case A52_CHANNEL:
63 audio->channels++;
64 break;
65 case A52_MONO:
66 audio->channels++;
67 break;
68 case A52_STEREO:
69 audio->channels += 2;
70 break;
71 case A52_3F:
72 audio->channels += 3;
73 break;
74 case A52_2F1R:
75 audio->channels += 3;
76 break;
77 case A52_3F1R:
78 audio->channels += 4;
79 break;
80 case A52_2F2R:
81 audio->channels += 4;
82 break;
83 case A52_3F2R:
84 audio->channels += 5;
85 break;
86 case A52_DOLBY:
87 audio->channels += 2;
88 break;
89 default:
90 printf("mpeg3_ac3_header: unknown channel code: %p\n", audio->flags & A52_CHANNEL_MASK);
91 break;
94 //printf("mpeg3_ac3_header 1 %d\n", audio->channels);
95 return result;
99 int mpeg3audio_doac3(mpeg3_ac3_t *audio,
100 char *frame,
101 int frame_size,
102 float **output,
103 int render)
105 int output_position = 0;
106 sample_t level = 1;
107 int i, j, k, l;
109 //printf("mpeg3audio_doac3 1\n");
110 a52_frame(audio->state,
111 frame,
112 &audio->flags,
113 &level,
115 //printf("mpeg3audio_doac3 2\n");
116 a52_dynrng(audio->state, NULL, NULL);
117 //printf("mpeg3audio_doac3 3\n");
118 for(i = 0; i < 6; i++)
120 if(!a52_block(audio->state))
122 l = 0;
123 if(render)
125 for(j = 0; j < audio->channels; j++)
127 for(k = 0; k < 256; k++)
129 output[j][output_position + k] = ((sample_t*)audio->output)[l];
130 l++;
134 output_position += 256;
139 return output_position;