xref: /aosp_15_r20/external/libxaac/test/decoder/ixheaacd_fileifc.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #ifndef CORTEX_M4
23*15dc779aSAndroid Build Coastguard Worker #include <stdio.h>
24*15dc779aSAndroid Build Coastguard Worker #else
25*15dc779aSAndroid Build Coastguard Worker #include "cm4_file_operations.h"
26*15dc779aSAndroid Build Coastguard Worker #endif
27*15dc779aSAndroid Build Coastguard Worker #include <assert.h>
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_fileifc.h"
30*15dc779aSAndroid Build Coastguard Worker #ifndef min
31*15dc779aSAndroid Build Coastguard Worker #define min(a, b) (((a) < (b)) ? (a) : (b))
32*15dc779aSAndroid Build Coastguard Worker #endif
33*15dc779aSAndroid Build Coastguard Worker 
34*15dc779aSAndroid Build Coastguard Worker //#define INCLUDE_MP4_PARSER
35*15dc779aSAndroid Build Coastguard Worker 
FileWrapper_Open(char fileName[])36*15dc779aSAndroid Build Coastguard Worker FileWrapperPtr FileWrapper_Open(char fileName[]) {
37*15dc779aSAndroid Build Coastguard Worker   FileWrapperPtr transport = (FileWrapper *)calloc(1, sizeof(FileWrapper));
38*15dc779aSAndroid Build Coastguard Worker 
39*15dc779aSAndroid Build Coastguard Worker   transport->isMp4File = 0;
40*15dc779aSAndroid Build Coastguard Worker   transport->inputFile = NULL;
41*15dc779aSAndroid Build Coastguard Worker 
42*15dc779aSAndroid Build Coastguard Worker #ifdef INCLUDE_MP4_PARSER
43*15dc779aSAndroid Build Coastguard Worker 
44*15dc779aSAndroid Build Coastguard Worker   transport->header_given = 0;
45*15dc779aSAndroid Build Coastguard Worker   transport->fileCtxt = 0;
46*15dc779aSAndroid Build Coastguard Worker   transport->mp4Ctxt = 0;
47*15dc779aSAndroid Build Coastguard Worker   transport->interim_buffer = 0;
48*15dc779aSAndroid Build Coastguard Worker   transport->avail_buffer = 0;
49*15dc779aSAndroid Build Coastguard Worker 
50*15dc779aSAndroid Build Coastguard Worker   if ((transport->fileCtxt = it_fopen((void *)fileName, 1, 0)) == NULL) {
51*15dc779aSAndroid Build Coastguard Worker     transport->inputFile = fopen(fileName, "rb");
52*15dc779aSAndroid Build Coastguard Worker     if (!transport->inputFile) {
53*15dc779aSAndroid Build Coastguard Worker       free(transport);
54*15dc779aSAndroid Build Coastguard Worker       return 0;
55*15dc779aSAndroid Build Coastguard Worker     }
56*15dc779aSAndroid Build Coastguard Worker 
57*15dc779aSAndroid Build Coastguard Worker     else
58*15dc779aSAndroid Build Coastguard Worker       return transport;
59*15dc779aSAndroid Build Coastguard Worker   }
60*15dc779aSAndroid Build Coastguard Worker 
61*15dc779aSAndroid Build Coastguard Worker   if ((transport->mp4Ctxt = it_mp4_parser_init(transport->fileCtxt, NULL)) ==
62*15dc779aSAndroid Build Coastguard Worker       NULL) {
63*15dc779aSAndroid Build Coastguard Worker     transport->inputFile = fopen(fileName, "rb");
64*15dc779aSAndroid Build Coastguard Worker     if (!transport->inputFile) {
65*15dc779aSAndroid Build Coastguard Worker       free(transport);
66*15dc779aSAndroid Build Coastguard Worker       return 0;
67*15dc779aSAndroid Build Coastguard Worker     } else
68*15dc779aSAndroid Build Coastguard Worker       return transport;
69*15dc779aSAndroid Build Coastguard Worker   }
70*15dc779aSAndroid Build Coastguard Worker   transport->isMp4File = 1;
71*15dc779aSAndroid Build Coastguard Worker   /* 768 * max channels is the max audio block size for AAC */
72*15dc779aSAndroid Build Coastguard Worker   /* As max channels is 8 and +2 for upto two Ind CoupCh */
73*15dc779aSAndroid Build Coastguard Worker   transport->interim_buffer = malloc(10 * 768);
74*15dc779aSAndroid Build Coastguard Worker   if (transport->interim_buffer == NULL) {
75*15dc779aSAndroid Build Coastguard Worker     free(transport);
76*15dc779aSAndroid Build Coastguard Worker     return 0;
77*15dc779aSAndroid Build Coastguard Worker   }
78*15dc779aSAndroid Build Coastguard Worker   return transport;
79*15dc779aSAndroid Build Coastguard Worker #else
80*15dc779aSAndroid Build Coastguard Worker   transport->inputFile = fopen(fileName, "rb");
81*15dc779aSAndroid Build Coastguard Worker   if (!transport->inputFile) {
82*15dc779aSAndroid Build Coastguard Worker     free(transport);
83*15dc779aSAndroid Build Coastguard Worker     return 0;
84*15dc779aSAndroid Build Coastguard Worker   } else
85*15dc779aSAndroid Build Coastguard Worker     return transport;
86*15dc779aSAndroid Build Coastguard Worker #endif
87*15dc779aSAndroid Build Coastguard Worker }
88*15dc779aSAndroid Build Coastguard Worker 
FileWrapper_Read(FileWrapperPtr transport,unsigned char * buffer,int bufSize,unsigned int * length)89*15dc779aSAndroid Build Coastguard Worker int FileWrapper_Read(FileWrapperPtr transport, unsigned char *buffer,
90*15dc779aSAndroid Build Coastguard Worker                      int bufSize, unsigned int *length) {
91*15dc779aSAndroid Build Coastguard Worker #ifdef INCLUDE_MP4_PARSER
92*15dc779aSAndroid Build Coastguard Worker   if (!transport->isMp4File)
93*15dc779aSAndroid Build Coastguard Worker     *length = fread(buffer, 1, bufSize, transport->inputFile);
94*15dc779aSAndroid Build Coastguard Worker   else {
95*15dc779aSAndroid Build Coastguard Worker     int errorCode;
96*15dc779aSAndroid Build Coastguard Worker     if (transport->header_given == 0) {
97*15dc779aSAndroid Build Coastguard Worker       transport->headerCtxt.header = (void *)buffer;
98*15dc779aSAndroid Build Coastguard Worker       /* MP4 Hook: Audio Header data to be put in buffer pointed by
99*15dc779aSAndroid Build Coastguard Worker       // headerCtxt.header and length to be put in headerCtxt.headerLength*/
100*15dc779aSAndroid Build Coastguard Worker       errorCode =
101*15dc779aSAndroid Build Coastguard Worker           it_mp4_get_audio_header(transport->mp4Ctxt, &transport->headerCtxt);
102*15dc779aSAndroid Build Coastguard Worker       transport->header_given = 1;
103*15dc779aSAndroid Build Coastguard Worker       if (errorCode != 0) /* IT_OK = 0 */
104*15dc779aSAndroid Build Coastguard Worker       {
105*15dc779aSAndroid Build Coastguard Worker         *length = 0;
106*15dc779aSAndroid Build Coastguard Worker         return 1;
107*15dc779aSAndroid Build Coastguard Worker       }
108*15dc779aSAndroid Build Coastguard Worker       *length = transport->headerCtxt.headerLength;
109*15dc779aSAndroid Build Coastguard Worker     } else {
110*15dc779aSAndroid Build Coastguard Worker       *length = 0;
111*15dc779aSAndroid Build Coastguard Worker /* MP4 Hook: Audio Data to be put in buffer pointed by frameCtxt.header*/
112*15dc779aSAndroid Build Coastguard Worker #ifndef ENABLE_LD_DEC
113*15dc779aSAndroid Build Coastguard Worker       while ((int)*length < bufSize)
114*15dc779aSAndroid Build Coastguard Worker #endif
115*15dc779aSAndroid Build Coastguard Worker       {
116*15dc779aSAndroid Build Coastguard Worker         if (transport->avail_buffer == 0) {
117*15dc779aSAndroid Build Coastguard Worker           transport->frameCtxt.frame = (void *)transport->interim_buffer;
118*15dc779aSAndroid Build Coastguard Worker           errorCode =
119*15dc779aSAndroid Build Coastguard Worker               it_mp4_get_audio(transport->mp4Ctxt, &transport->frameCtxt);
120*15dc779aSAndroid Build Coastguard Worker           if (errorCode != 0) /* IT_OK = 0 */
121*15dc779aSAndroid Build Coastguard Worker           {
122*15dc779aSAndroid Build Coastguard Worker             if (*length == 0)
123*15dc779aSAndroid Build Coastguard Worker               return 1;
124*15dc779aSAndroid Build Coastguard Worker             else
125*15dc779aSAndroid Build Coastguard Worker #ifndef ENABLE_LD_DEC
126*15dc779aSAndroid Build Coastguard Worker               break;
127*15dc779aSAndroid Build Coastguard Worker #else
128*15dc779aSAndroid Build Coastguard Worker               return 1;
129*15dc779aSAndroid Build Coastguard Worker #endif
130*15dc779aSAndroid Build Coastguard Worker           }
131*15dc779aSAndroid Build Coastguard Worker           transport->avail_buffer += transport->frameCtxt.frameLength;
132*15dc779aSAndroid Build Coastguard Worker         }
133*15dc779aSAndroid Build Coastguard Worker #ifndef ENABLE_LD_DEC
134*15dc779aSAndroid Build Coastguard Worker         else
135*15dc779aSAndroid Build Coastguard Worker #endif
136*15dc779aSAndroid Build Coastguard Worker         {
137*15dc779aSAndroid Build Coastguard Worker           int size_to_cpy =
138*15dc779aSAndroid Build Coastguard Worker               min((int)(bufSize - *length), transport->avail_buffer);
139*15dc779aSAndroid Build Coastguard Worker           memcpy(buffer + (*length), transport->interim_buffer, size_to_cpy);
140*15dc779aSAndroid Build Coastguard Worker           memmove(transport->interim_buffer,
141*15dc779aSAndroid Build Coastguard Worker                   ((char *)transport->interim_buffer) + size_to_cpy,
142*15dc779aSAndroid Build Coastguard Worker                   (transport->avail_buffer - size_to_cpy));
143*15dc779aSAndroid Build Coastguard Worker           *length += size_to_cpy;
144*15dc779aSAndroid Build Coastguard Worker           transport->avail_buffer -= size_to_cpy;
145*15dc779aSAndroid Build Coastguard Worker         }
146*15dc779aSAndroid Build Coastguard Worker       }
147*15dc779aSAndroid Build Coastguard Worker     }
148*15dc779aSAndroid Build Coastguard Worker #ifdef DEBUG_ASSERT
149*15dc779aSAndroid Build Coastguard Worker     assert(*length <= (unsigned)bufSize);
150*15dc779aSAndroid Build Coastguard Worker #endif
151*15dc779aSAndroid Build Coastguard Worker   }
152*15dc779aSAndroid Build Coastguard Worker 
153*15dc779aSAndroid Build Coastguard Worker #else
154*15dc779aSAndroid Build Coastguard Worker   *length = (unsigned int)fread(buffer, 1, bufSize, transport->inputFile);
155*15dc779aSAndroid Build Coastguard Worker #endif
156*15dc779aSAndroid Build Coastguard Worker 
157*15dc779aSAndroid Build Coastguard Worker   return 0;
158*15dc779aSAndroid Build Coastguard Worker }
159*15dc779aSAndroid Build Coastguard Worker 
FileWrapper_Close(FileWrapperPtr transport)160*15dc779aSAndroid Build Coastguard Worker unsigned int FileWrapper_Close(FileWrapperPtr transport) {
161*15dc779aSAndroid Build Coastguard Worker   if (transport == 0) return 0;
162*15dc779aSAndroid Build Coastguard Worker 
163*15dc779aSAndroid Build Coastguard Worker #ifdef INCLUDE_MP4_PARSER
164*15dc779aSAndroid Build Coastguard Worker   if (transport->isMp4File) {
165*15dc779aSAndroid Build Coastguard Worker     it_mp4_parser_close(transport->mp4Ctxt);
166*15dc779aSAndroid Build Coastguard Worker     it_fclose(transport->fileCtxt);
167*15dc779aSAndroid Build Coastguard Worker   } else
168*15dc779aSAndroid Build Coastguard Worker #endif
169*15dc779aSAndroid Build Coastguard Worker       if (transport->inputFile)
170*15dc779aSAndroid Build Coastguard Worker     fclose(transport->inputFile);
171*15dc779aSAndroid Build Coastguard Worker 
172*15dc779aSAndroid Build Coastguard Worker   free(transport);
173*15dc779aSAndroid Build Coastguard Worker   return 0;
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker 
FileWrapper_IsMp4File(FileWrapperPtr transport)176*15dc779aSAndroid Build Coastguard Worker unsigned int FileWrapper_IsMp4File(FileWrapperPtr transport) {
177*15dc779aSAndroid Build Coastguard Worker   return transport->isMp4File;
178*15dc779aSAndroid Build Coastguard Worker }
179