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