1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker *
4*bebae9c0SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker *
8*bebae9c0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker *
10*bebae9c0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker */
16*bebae9c0SAndroid Build Coastguard Worker
17*bebae9c0SAndroid Build Coastguard Worker /* AndroidBufferQueue implementation */
18*bebae9c0SAndroid Build Coastguard Worker
19*bebae9c0SAndroid Build Coastguard Worker //#define USE_LOG SLAndroidLogLevel_Verbose
20*bebae9c0SAndroid Build Coastguard Worker
21*bebae9c0SAndroid Build Coastguard Worker #include "sles_allinclusive.h"
22*bebae9c0SAndroid Build Coastguard Worker // for AAC ADTS verification on enqueue:
23*bebae9c0SAndroid Build Coastguard Worker #include "android/include/AacBqToPcmCbRenderer.h"
24*bebae9c0SAndroid Build Coastguard Worker
25*bebae9c0SAndroid Build Coastguard Worker /**
26*bebae9c0SAndroid Build Coastguard Worker * Determine the state of the audio player or media player associated with a buffer queue.
27*bebae9c0SAndroid Build Coastguard Worker * Note that PLAYSTATE and RECORDSTATE values are equivalent (where PLAYING == RECORDING).
28*bebae9c0SAndroid Build Coastguard Worker */
29*bebae9c0SAndroid Build Coastguard Worker
getAssociatedState(IAndroidBufferQueue * thiz)30*bebae9c0SAndroid Build Coastguard Worker static SLuint32 getAssociatedState(IAndroidBufferQueue *thiz)
31*bebae9c0SAndroid Build Coastguard Worker {
32*bebae9c0SAndroid Build Coastguard Worker SLuint32 state;
33*bebae9c0SAndroid Build Coastguard Worker switch (InterfaceToObjectID(thiz)) {
34*bebae9c0SAndroid Build Coastguard Worker case XA_OBJECTID_MEDIAPLAYER:
35*bebae9c0SAndroid Build Coastguard Worker state = ((CMediaPlayer *) thiz->mThis)->mPlay.mState;
36*bebae9c0SAndroid Build Coastguard Worker break;
37*bebae9c0SAndroid Build Coastguard Worker case SL_OBJECTID_AUDIOPLAYER:
38*bebae9c0SAndroid Build Coastguard Worker state = ((CAudioPlayer *) thiz->mThis)->mPlay.mState;
39*bebae9c0SAndroid Build Coastguard Worker break;
40*bebae9c0SAndroid Build Coastguard Worker default:
41*bebae9c0SAndroid Build Coastguard Worker // unreachable, but just in case we will assume it is stopped
42*bebae9c0SAndroid Build Coastguard Worker assert(SL_BOOLEAN_FALSE);
43*bebae9c0SAndroid Build Coastguard Worker state = SL_PLAYSTATE_STOPPED;
44*bebae9c0SAndroid Build Coastguard Worker break;
45*bebae9c0SAndroid Build Coastguard Worker }
46*bebae9c0SAndroid Build Coastguard Worker return state;
47*bebae9c0SAndroid Build Coastguard Worker }
48*bebae9c0SAndroid Build Coastguard Worker
49*bebae9c0SAndroid Build Coastguard Worker
50*bebae9c0SAndroid Build Coastguard Worker /**
51*bebae9c0SAndroid Build Coastguard Worker * parse and set the items associated with the given buffer, based on the buffer type,
52*bebae9c0SAndroid Build Coastguard Worker * which determines the set of authorized items and format
53*bebae9c0SAndroid Build Coastguard Worker */
setItems(SLuint32 dataLength,const SLAndroidBufferItem * pItems,SLuint32 itemsLength,SLuint16 bufferType,AdvancedBufferHeader * pBuff,bool * pEOS)54*bebae9c0SAndroid Build Coastguard Worker static SLresult setItems(SLuint32 dataLength,
55*bebae9c0SAndroid Build Coastguard Worker const SLAndroidBufferItem *pItems, SLuint32 itemsLength,
56*bebae9c0SAndroid Build Coastguard Worker SLuint16 bufferType, AdvancedBufferHeader *pBuff, bool *pEOS)
57*bebae9c0SAndroid Build Coastguard Worker {
58*bebae9c0SAndroid Build Coastguard Worker // reset item structure based on type
59*bebae9c0SAndroid Build Coastguard Worker switch (bufferType) {
60*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeMpeg2Ts:
61*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mTsCmdCode = ANDROID_MP2TSEVENT_NONE;
62*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mPts = 0;
63*bebae9c0SAndroid Build Coastguard Worker break;
64*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeAacadts:
65*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mAdtsCmdData.mAdtsCmdCode = ANDROID_ADTSEVENT_NONE;
66*bebae9c0SAndroid Build Coastguard Worker break;
67*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeInvalid:
68*bebae9c0SAndroid Build Coastguard Worker default:
69*bebae9c0SAndroid Build Coastguard Worker // shouldn't happen, but just in case clear out the item structure
70*bebae9c0SAndroid Build Coastguard Worker memset(&pBuff->mItems, 0, sizeof(AdvancedBufferItems));
71*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_INTERNAL_ERROR;
72*bebae9c0SAndroid Build Coastguard Worker }
73*bebae9c0SAndroid Build Coastguard Worker
74*bebae9c0SAndroid Build Coastguard Worker // process all items in the array; if no items then we break out of loop immediately
75*bebae9c0SAndroid Build Coastguard Worker while (itemsLength > 0) {
76*bebae9c0SAndroid Build Coastguard Worker
77*bebae9c0SAndroid Build Coastguard Worker // remaining length must be large enough for one full item without any associated data
78*bebae9c0SAndroid Build Coastguard Worker if (itemsLength < sizeof(SLAndroidBufferItem)) {
79*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Partial item at end of array");
80*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
81*bebae9c0SAndroid Build Coastguard Worker }
82*bebae9c0SAndroid Build Coastguard Worker itemsLength -= sizeof(SLAndroidBufferItem);
83*bebae9c0SAndroid Build Coastguard Worker
84*bebae9c0SAndroid Build Coastguard Worker // remaining length must be large enough for data with current item and alignment padding
85*bebae9c0SAndroid Build Coastguard Worker SLuint32 itemDataSizeWithAlignmentPadding = (pItems->itemSize + 3) & ~3;
86*bebae9c0SAndroid Build Coastguard Worker if (itemsLength < itemDataSizeWithAlignmentPadding) {
87*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Partial item data at end of array");
88*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
89*bebae9c0SAndroid Build Coastguard Worker }
90*bebae9c0SAndroid Build Coastguard Worker itemsLength -= itemDataSizeWithAlignmentPadding;
91*bebae9c0SAndroid Build Coastguard Worker
92*bebae9c0SAndroid Build Coastguard Worker // parse item data based on type
93*bebae9c0SAndroid Build Coastguard Worker switch (bufferType) {
94*bebae9c0SAndroid Build Coastguard Worker
95*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeMpeg2Ts: {
96*bebae9c0SAndroid Build Coastguard Worker switch (pItems->itemKey) {
97*bebae9c0SAndroid Build Coastguard Worker
98*bebae9c0SAndroid Build Coastguard Worker case SL_ANDROID_ITEMKEY_EOS:
99*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mTsCmdCode |= ANDROID_MP2TSEVENT_EOS;
100*bebae9c0SAndroid Build Coastguard Worker //SL_LOGD("Found EOS event=%d", pBuff->mItems.mTsCmdData.mTsCmdCode);
101*bebae9c0SAndroid Build Coastguard Worker if (pItems->itemSize != 0) {
102*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Invalid item parameter size %u for EOS", pItems->itemSize);
103*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
104*bebae9c0SAndroid Build Coastguard Worker }
105*bebae9c0SAndroid Build Coastguard Worker break;
106*bebae9c0SAndroid Build Coastguard Worker
107*bebae9c0SAndroid Build Coastguard Worker case SL_ANDROID_ITEMKEY_DISCONTINUITY:
108*bebae9c0SAndroid Build Coastguard Worker if (pItems->itemSize == 0) {
109*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mTsCmdCode |= ANDROID_MP2TSEVENT_DISCONTINUITY;
110*bebae9c0SAndroid Build Coastguard Worker //SL_LOGD("Found DISCONTINUITYevent=%d", pBuff->mItems.mTsCmdData.mTsCmdCode);
111*bebae9c0SAndroid Build Coastguard Worker } else if (pItems->itemSize == sizeof(SLAuint64)) {
112*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mTsCmdCode |= ANDROID_MP2TSEVENT_DISCON_NEWPTS;
113*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mPts = *((SLAuint64*)pItems->itemData);
114*bebae9c0SAndroid Build Coastguard Worker //SL_LOGD("Found PTS=%lld", pBuff->mItems.mTsCmdData.mPts);
115*bebae9c0SAndroid Build Coastguard Worker } else {
116*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Invalid item parameter size %u for MPEG-2 PTS", pItems->itemSize);
117*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
118*bebae9c0SAndroid Build Coastguard Worker }
119*bebae9c0SAndroid Build Coastguard Worker break;
120*bebae9c0SAndroid Build Coastguard Worker
121*bebae9c0SAndroid Build Coastguard Worker case SL_ANDROID_ITEMKEY_FORMAT_CHANGE:
122*bebae9c0SAndroid Build Coastguard Worker // distinguish between a "full" format change and one where it says what changed
123*bebae9c0SAndroid Build Coastguard Worker if (pItems->itemSize == 0) {
124*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("Received format change with no data == full format change");
125*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mTsCmdCode |= ANDROID_MP2TSEVENT_FORMAT_CHANGE_FULL;
126*bebae9c0SAndroid Build Coastguard Worker } else if (pItems->itemSize == sizeof(SLuint32)) {
127*bebae9c0SAndroid Build Coastguard Worker XAuint32 formatData = *((XAuint32*)pItems->itemData);
128*bebae9c0SAndroid Build Coastguard Worker // intentionally only supporting video change when reading which specific
129*bebae9c0SAndroid Build Coastguard Worker // stream has changed, interpret other changes as full change
130*bebae9c0SAndroid Build Coastguard Worker if (formatData == XA_ANDROID_FORMATCHANGE_ITEMDATA_VIDEO) {
131*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mTsCmdCode |=
132*bebae9c0SAndroid Build Coastguard Worker ANDROID_MP2TSEVENT_FORMAT_CHANGE_VIDEO;
133*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("Received video format change");
134*bebae9c0SAndroid Build Coastguard Worker } else {
135*bebae9c0SAndroid Build Coastguard Worker // note that we don't support specifying
136*bebae9c0SAndroid Build Coastguard Worker // ANDROID_MP2TSEVENT_FORMAT_CHANGE_FULL by having all bits of
137*bebae9c0SAndroid Build Coastguard Worker // the data mask set, we default to it with unsupported masks
138*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Received format change with unsupported data, ignoring data");
139*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mTsCmdCode |=
140*bebae9c0SAndroid Build Coastguard Worker ANDROID_MP2TSEVENT_FORMAT_CHANGE_FULL;
141*bebae9c0SAndroid Build Coastguard Worker }
142*bebae9c0SAndroid Build Coastguard Worker } else {
143*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Received format change with invalid data size, ignoring data");
144*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mTsCmdData.mTsCmdCode |= ANDROID_MP2TSEVENT_FORMAT_CHANGE_FULL;
145*bebae9c0SAndroid Build Coastguard Worker }
146*bebae9c0SAndroid Build Coastguard Worker break;
147*bebae9c0SAndroid Build Coastguard Worker
148*bebae9c0SAndroid Build Coastguard Worker default:
149*bebae9c0SAndroid Build Coastguard Worker // unknown item key
150*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Unknown item key %u with size %u", pItems->itemKey, pItems->itemSize);
151*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
152*bebae9c0SAndroid Build Coastguard Worker
153*bebae9c0SAndroid Build Coastguard Worker }// switch (pItems->itemKey)
154*bebae9c0SAndroid Build Coastguard Worker } break;
155*bebae9c0SAndroid Build Coastguard Worker
156*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeAacadts: {
157*bebae9c0SAndroid Build Coastguard Worker switch (pItems->itemKey) {
158*bebae9c0SAndroid Build Coastguard Worker
159*bebae9c0SAndroid Build Coastguard Worker case SL_ANDROID_ITEMKEY_EOS:
160*bebae9c0SAndroid Build Coastguard Worker pBuff->mItems.mAdtsCmdData.mAdtsCmdCode |= ANDROID_ADTSEVENT_EOS;
161*bebae9c0SAndroid Build Coastguard Worker if (pItems->itemSize != 0) {
162*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Invalid item parameter size %u for EOS", pItems->itemSize);
163*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
164*bebae9c0SAndroid Build Coastguard Worker }
165*bebae9c0SAndroid Build Coastguard Worker break;
166*bebae9c0SAndroid Build Coastguard Worker
167*bebae9c0SAndroid Build Coastguard Worker default:
168*bebae9c0SAndroid Build Coastguard Worker // unknown item key
169*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Unknown item key %u with size %u", pItems->itemKey, pItems->itemSize);
170*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
171*bebae9c0SAndroid Build Coastguard Worker
172*bebae9c0SAndroid Build Coastguard Worker }// switch (pItems->itemKey)
173*bebae9c0SAndroid Build Coastguard Worker } break;
174*bebae9c0SAndroid Build Coastguard Worker
175*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeInvalid:
176*bebae9c0SAndroid Build Coastguard Worker default:
177*bebae9c0SAndroid Build Coastguard Worker // not reachable as we checked this earlier
178*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_INTERNAL_ERROR;
179*bebae9c0SAndroid Build Coastguard Worker
180*bebae9c0SAndroid Build Coastguard Worker }// switch (bufferType)
181*bebae9c0SAndroid Build Coastguard Worker
182*bebae9c0SAndroid Build Coastguard Worker // skip past this item, including data with alignment padding
183*bebae9c0SAndroid Build Coastguard Worker pItems = (SLAndroidBufferItem *) ((char *) pItems +
184*bebae9c0SAndroid Build Coastguard Worker sizeof(SLAndroidBufferItem) + itemDataSizeWithAlignmentPadding);
185*bebae9c0SAndroid Build Coastguard Worker }
186*bebae9c0SAndroid Build Coastguard Worker
187*bebae9c0SAndroid Build Coastguard Worker // now check for invalid combinations of items
188*bebae9c0SAndroid Build Coastguard Worker switch (bufferType) {
189*bebae9c0SAndroid Build Coastguard Worker
190*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeMpeg2Ts: {
191*bebae9c0SAndroid Build Coastguard Worker // supported Mpeg2Ts commands are mutually exclusive
192*bebae9c0SAndroid Build Coastguard Worker switch (pBuff->mItems.mTsCmdData.mTsCmdCode) {
193*bebae9c0SAndroid Build Coastguard Worker // single items are allowed
194*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_EOS:
195*bebae9c0SAndroid Build Coastguard Worker if (dataLength > 0) {
196*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Can't enqueue non-zero data with EOS");
197*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PRECONDITIONS_VIOLATED;
198*bebae9c0SAndroid Build Coastguard Worker }
199*bebae9c0SAndroid Build Coastguard Worker *pEOS = true;
200*bebae9c0SAndroid Build Coastguard Worker break;
201*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_NONE:
202*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_DISCONTINUITY:
203*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_DISCON_NEWPTS:
204*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_FORMAT_CHANGE_FULL:
205*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_FORMAT_CHANGE_VIDEO:
206*bebae9c0SAndroid Build Coastguard Worker break;
207*bebae9c0SAndroid Build Coastguard Worker // no combinations are allowed
208*bebae9c0SAndroid Build Coastguard Worker default:
209*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Invalid combination of items");
210*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
211*bebae9c0SAndroid Build Coastguard Worker }
212*bebae9c0SAndroid Build Coastguard Worker } break;
213*bebae9c0SAndroid Build Coastguard Worker
214*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeAacadts: {
215*bebae9c0SAndroid Build Coastguard Worker // only one item supported, and thus no combination check needed
216*bebae9c0SAndroid Build Coastguard Worker if (pBuff->mItems.mAdtsCmdData.mAdtsCmdCode == ANDROID_ADTSEVENT_EOS) {
217*bebae9c0SAndroid Build Coastguard Worker if (dataLength > 0) {
218*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Can't enqueue non-zero data with EOS");
219*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PRECONDITIONS_VIOLATED;
220*bebae9c0SAndroid Build Coastguard Worker }
221*bebae9c0SAndroid Build Coastguard Worker *pEOS = true;
222*bebae9c0SAndroid Build Coastguard Worker }
223*bebae9c0SAndroid Build Coastguard Worker } break;
224*bebae9c0SAndroid Build Coastguard Worker
225*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeInvalid:
226*bebae9c0SAndroid Build Coastguard Worker default:
227*bebae9c0SAndroid Build Coastguard Worker // not reachable as we checked this earlier
228*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_INTERNAL_ERROR;
229*bebae9c0SAndroid Build Coastguard Worker }
230*bebae9c0SAndroid Build Coastguard Worker
231*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_SUCCESS;
232*bebae9c0SAndroid Build Coastguard Worker }
233*bebae9c0SAndroid Build Coastguard Worker
234*bebae9c0SAndroid Build Coastguard Worker
IAndroidBufferQueue_RegisterCallback(SLAndroidBufferQueueItf self,slAndroidBufferQueueCallback callback,void * pContext)235*bebae9c0SAndroid Build Coastguard Worker static SLresult IAndroidBufferQueue_RegisterCallback(SLAndroidBufferQueueItf self,
236*bebae9c0SAndroid Build Coastguard Worker slAndroidBufferQueueCallback callback, void *pContext)
237*bebae9c0SAndroid Build Coastguard Worker {
238*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
239*bebae9c0SAndroid Build Coastguard Worker
240*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue *thiz = (IAndroidBufferQueue *) self;
241*bebae9c0SAndroid Build Coastguard Worker
242*bebae9c0SAndroid Build Coastguard Worker interface_lock_exclusive(thiz);
243*bebae9c0SAndroid Build Coastguard Worker
244*bebae9c0SAndroid Build Coastguard Worker // verify pre-condition that media object is in the SL_PLAYSTATE_STOPPED state
245*bebae9c0SAndroid Build Coastguard Worker if (SL_PLAYSTATE_STOPPED == getAssociatedState(thiz)) {
246*bebae9c0SAndroid Build Coastguard Worker thiz->mCallback = callback;
247*bebae9c0SAndroid Build Coastguard Worker thiz->mContext = pContext;
248*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
249*bebae9c0SAndroid Build Coastguard Worker
250*bebae9c0SAndroid Build Coastguard Worker } else {
251*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PRECONDITIONS_VIOLATED;
252*bebae9c0SAndroid Build Coastguard Worker }
253*bebae9c0SAndroid Build Coastguard Worker
254*bebae9c0SAndroid Build Coastguard Worker interface_unlock_exclusive(thiz);
255*bebae9c0SAndroid Build Coastguard Worker
256*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
257*bebae9c0SAndroid Build Coastguard Worker }
258*bebae9c0SAndroid Build Coastguard Worker
259*bebae9c0SAndroid Build Coastguard Worker
IAndroidBufferQueue_Clear(SLAndroidBufferQueueItf self)260*bebae9c0SAndroid Build Coastguard Worker static SLresult IAndroidBufferQueue_Clear(SLAndroidBufferQueueItf self)
261*bebae9c0SAndroid Build Coastguard Worker {
262*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
263*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
264*bebae9c0SAndroid Build Coastguard Worker
265*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue *thiz = (IAndroidBufferQueue *) self;
266*bebae9c0SAndroid Build Coastguard Worker
267*bebae9c0SAndroid Build Coastguard Worker interface_lock_exclusive(thiz);
268*bebae9c0SAndroid Build Coastguard Worker
269*bebae9c0SAndroid Build Coastguard Worker // reset the queue pointers
270*bebae9c0SAndroid Build Coastguard Worker thiz->mFront = &thiz->mBufferArray[0];
271*bebae9c0SAndroid Build Coastguard Worker thiz->mRear = &thiz->mBufferArray[0];
272*bebae9c0SAndroid Build Coastguard Worker // reset the queue state
273*bebae9c0SAndroid Build Coastguard Worker thiz->mState.count = 0;
274*bebae9c0SAndroid Build Coastguard Worker thiz->mState.index = 0;
275*bebae9c0SAndroid Build Coastguard Worker
276*bebae9c0SAndroid Build Coastguard Worker // object-specific behavior for a clear
277*bebae9c0SAndroid Build Coastguard Worker switch (InterfaceToObjectID(thiz)) {
278*bebae9c0SAndroid Build Coastguard Worker case SL_OBJECTID_AUDIOPLAYER:
279*bebae9c0SAndroid Build Coastguard Worker android_audioPlayer_androidBufferQueue_clear_l((CAudioPlayer*) thiz->mThis);
280*bebae9c0SAndroid Build Coastguard Worker break;
281*bebae9c0SAndroid Build Coastguard Worker case XA_OBJECTID_MEDIAPLAYER:
282*bebae9c0SAndroid Build Coastguard Worker android_Player_androidBufferQueue_clear_l((CMediaPlayer*) thiz->mThis);
283*bebae9c0SAndroid Build Coastguard Worker break;
284*bebae9c0SAndroid Build Coastguard Worker default:
285*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
286*bebae9c0SAndroid Build Coastguard Worker }
287*bebae9c0SAndroid Build Coastguard Worker
288*bebae9c0SAndroid Build Coastguard Worker interface_unlock_exclusive(thiz);
289*bebae9c0SAndroid Build Coastguard Worker
290*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
291*bebae9c0SAndroid Build Coastguard Worker }
292*bebae9c0SAndroid Build Coastguard Worker
293*bebae9c0SAndroid Build Coastguard Worker
IAndroidBufferQueue_Enqueue(SLAndroidBufferQueueItf self,void * pBufferContext,void * pData,SLuint32 dataLength,const SLAndroidBufferItem * pItems,SLuint32 itemsLength)294*bebae9c0SAndroid Build Coastguard Worker static SLresult IAndroidBufferQueue_Enqueue(SLAndroidBufferQueueItf self,
295*bebae9c0SAndroid Build Coastguard Worker void *pBufferContext,
296*bebae9c0SAndroid Build Coastguard Worker void *pData,
297*bebae9c0SAndroid Build Coastguard Worker SLuint32 dataLength,
298*bebae9c0SAndroid Build Coastguard Worker const SLAndroidBufferItem *pItems,
299*bebae9c0SAndroid Build Coastguard Worker SLuint32 itemsLength)
300*bebae9c0SAndroid Build Coastguard Worker {
301*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
302*bebae9c0SAndroid Build Coastguard Worker SL_LOGD("IAndroidBufferQueue_Enqueue pData=%p dataLength=%d", pData, dataLength);
303*bebae9c0SAndroid Build Coastguard Worker
304*bebae9c0SAndroid Build Coastguard Worker if ((dataLength > 0) && (NULL == pData)) {
305*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Enqueue failure: non-zero data length %u but NULL data pointer", dataLength);
306*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
307*bebae9c0SAndroid Build Coastguard Worker } else if ((itemsLength > 0) && (NULL == pItems)) {
308*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Enqueue failure: non-zero items length %u but NULL items pointer", itemsLength);
309*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
310*bebae9c0SAndroid Build Coastguard Worker } else if ((0 == dataLength) && (0 == itemsLength)) {
311*bebae9c0SAndroid Build Coastguard Worker // no data and no msg
312*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Enqueue failure: trying to enqueue buffer with no data and no items.");
313*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
314*bebae9c0SAndroid Build Coastguard Worker // Note that a non-NULL data pointer with zero data length is allowed.
315*bebae9c0SAndroid Build Coastguard Worker // We track that data pointer as it moves through the queue
316*bebae9c0SAndroid Build Coastguard Worker // to assist the application in accounting for data buffers.
317*bebae9c0SAndroid Build Coastguard Worker // A non-NULL items pointer with zero items length is also allowed, but has no value.
318*bebae9c0SAndroid Build Coastguard Worker } else {
319*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue *thiz = (IAndroidBufferQueue *) self;
320*bebae9c0SAndroid Build Coastguard Worker
321*bebae9c0SAndroid Build Coastguard Worker // buffer size check, can be done outside of lock because buffer type can't change
322*bebae9c0SAndroid Build Coastguard Worker switch (thiz->mBufferType) {
323*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeMpeg2Ts:
324*bebae9c0SAndroid Build Coastguard Worker if (dataLength % MPEG2_TS_PACKET_SIZE == 0) {
325*bebae9c0SAndroid Build Coastguard Worker // The downstream Stagefright MPEG-2 TS parser is sensitive to format errors,
326*bebae9c0SAndroid Build Coastguard Worker // so do a quick sanity check beforehand on the first packet of the buffer.
327*bebae9c0SAndroid Build Coastguard Worker // We don't check all the packets to avoid thrashing the data cache.
328*bebae9c0SAndroid Build Coastguard Worker if ((dataLength > 0) && (*(SLuint8 *)pData != MPEG2_TS_PACKET_SYNC)) {
329*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Error enqueueing MPEG-2 TS data: incorrect packet sync");
330*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_CONTENT_CORRUPTED;
331*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
332*bebae9c0SAndroid Build Coastguard Worker }
333*bebae9c0SAndroid Build Coastguard Worker break;
334*bebae9c0SAndroid Build Coastguard Worker }
335*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Error enqueueing MPEG-2 TS data: size must be a multiple of %d (packet size)",
336*bebae9c0SAndroid Build Coastguard Worker MPEG2_TS_PACKET_SIZE);
337*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
338*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
339*bebae9c0SAndroid Build Coastguard Worker break;
340*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeAacadts:
341*bebae9c0SAndroid Build Coastguard Worker // zero dataLength is permitted in case of EOS command only
342*bebae9c0SAndroid Build Coastguard Worker if (dataLength > 0) {
343*bebae9c0SAndroid Build Coastguard Worker result = android::AacBqToPcmCbRenderer::validateBufferStartEndOnFrameBoundaries(
344*bebae9c0SAndroid Build Coastguard Worker pData, dataLength);
345*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
346*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Error enqueueing ADTS data: data must start and end on frame "
347*bebae9c0SAndroid Build Coastguard Worker "boundaries");
348*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
349*bebae9c0SAndroid Build Coastguard Worker }
350*bebae9c0SAndroid Build Coastguard Worker }
351*bebae9c0SAndroid Build Coastguard Worker break;
352*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeInvalid:
353*bebae9c0SAndroid Build Coastguard Worker default:
354*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
355*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
356*bebae9c0SAndroid Build Coastguard Worker }
357*bebae9c0SAndroid Build Coastguard Worker
358*bebae9c0SAndroid Build Coastguard Worker interface_lock_exclusive(thiz);
359*bebae9c0SAndroid Build Coastguard Worker
360*bebae9c0SAndroid Build Coastguard Worker AdvancedBufferHeader *oldRear = thiz->mRear, *newRear;
361*bebae9c0SAndroid Build Coastguard Worker if ((newRear = oldRear + 1) == &thiz->mBufferArray[thiz->mNumBuffers + 1]) {
362*bebae9c0SAndroid Build Coastguard Worker newRear = thiz->mBufferArray;
363*bebae9c0SAndroid Build Coastguard Worker }
364*bebae9c0SAndroid Build Coastguard Worker if (thiz->mEOS) {
365*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Can't enqueue after EOS");
366*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PRECONDITIONS_VIOLATED;
367*bebae9c0SAndroid Build Coastguard Worker } else if (newRear == thiz->mFront) {
368*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_BUFFER_INSUFFICIENT;
369*bebae9c0SAndroid Build Coastguard Worker } else {
370*bebae9c0SAndroid Build Coastguard Worker // set oldRear->mItems based on items
371*bebae9c0SAndroid Build Coastguard Worker result = setItems(dataLength, pItems, itemsLength, thiz->mBufferType, oldRear,
372*bebae9c0SAndroid Build Coastguard Worker &thiz->mEOS);
373*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
374*bebae9c0SAndroid Build Coastguard Worker oldRear->mDataBuffer = pData;
375*bebae9c0SAndroid Build Coastguard Worker oldRear->mDataSize = dataLength;
376*bebae9c0SAndroid Build Coastguard Worker oldRear->mDataSizeConsumed = 0;
377*bebae9c0SAndroid Build Coastguard Worker oldRear->mBufferContext = pBufferContext;
378*bebae9c0SAndroid Build Coastguard Worker //oldRear->mBufferState = TBD;
379*bebae9c0SAndroid Build Coastguard Worker thiz->mRear = newRear;
380*bebae9c0SAndroid Build Coastguard Worker ++thiz->mState.count;
381*bebae9c0SAndroid Build Coastguard Worker }
382*bebae9c0SAndroid Build Coastguard Worker }
383*bebae9c0SAndroid Build Coastguard Worker // set enqueue attribute if state is PLAYING and the first buffer is enqueued
384*bebae9c0SAndroid Build Coastguard Worker interface_unlock_exclusive_attributes(thiz, ((SL_RESULT_SUCCESS == result) &&
385*bebae9c0SAndroid Build Coastguard Worker (1 == thiz->mState.count) && (SL_PLAYSTATE_PLAYING == getAssociatedState(thiz))) ?
386*bebae9c0SAndroid Build Coastguard Worker ATTR_ABQ_ENQUEUE : ATTR_NONE);
387*bebae9c0SAndroid Build Coastguard Worker }
388*bebae9c0SAndroid Build Coastguard Worker
389*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
390*bebae9c0SAndroid Build Coastguard Worker }
391*bebae9c0SAndroid Build Coastguard Worker
392*bebae9c0SAndroid Build Coastguard Worker
IAndroidBufferQueue_GetState(SLAndroidBufferQueueItf self,SLAndroidBufferQueueState * pState)393*bebae9c0SAndroid Build Coastguard Worker static SLresult IAndroidBufferQueue_GetState(SLAndroidBufferQueueItf self,
394*bebae9c0SAndroid Build Coastguard Worker SLAndroidBufferQueueState *pState)
395*bebae9c0SAndroid Build Coastguard Worker {
396*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
397*bebae9c0SAndroid Build Coastguard Worker
398*bebae9c0SAndroid Build Coastguard Worker // Note that GetState while a Clear is pending is equivalent to GetState before the Clear
399*bebae9c0SAndroid Build Coastguard Worker
400*bebae9c0SAndroid Build Coastguard Worker if (NULL == pState) {
401*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
402*bebae9c0SAndroid Build Coastguard Worker } else {
403*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue *thiz = (IAndroidBufferQueue *) self;
404*bebae9c0SAndroid Build Coastguard Worker
405*bebae9c0SAndroid Build Coastguard Worker interface_lock_shared(thiz);
406*bebae9c0SAndroid Build Coastguard Worker
407*bebae9c0SAndroid Build Coastguard Worker pState->count = thiz->mState.count;
408*bebae9c0SAndroid Build Coastguard Worker pState->index = thiz->mState.index;
409*bebae9c0SAndroid Build Coastguard Worker
410*bebae9c0SAndroid Build Coastguard Worker interface_unlock_shared(thiz);
411*bebae9c0SAndroid Build Coastguard Worker
412*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
413*bebae9c0SAndroid Build Coastguard Worker }
414*bebae9c0SAndroid Build Coastguard Worker
415*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
416*bebae9c0SAndroid Build Coastguard Worker }
417*bebae9c0SAndroid Build Coastguard Worker
418*bebae9c0SAndroid Build Coastguard Worker
IAndroidBufferQueue_SetCallbackEventsMask(SLAndroidBufferQueueItf self,SLuint32 eventFlags)419*bebae9c0SAndroid Build Coastguard Worker static SLresult IAndroidBufferQueue_SetCallbackEventsMask(SLAndroidBufferQueueItf self,
420*bebae9c0SAndroid Build Coastguard Worker SLuint32 eventFlags)
421*bebae9c0SAndroid Build Coastguard Worker {
422*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
423*bebae9c0SAndroid Build Coastguard Worker
424*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue *thiz = (IAndroidBufferQueue *) self;
425*bebae9c0SAndroid Build Coastguard Worker interface_lock_exclusive(thiz);
426*bebae9c0SAndroid Build Coastguard Worker // FIXME only supporting SL_ANDROIDBUFFERQUEUEEVENT_PROCESSED in this implementation
427*bebae9c0SAndroid Build Coastguard Worker if (!(~(SL_ANDROIDBUFFERQUEUEEVENT_PROCESSED /* | others TBD */ ) & eventFlags)) {
428*bebae9c0SAndroid Build Coastguard Worker thiz->mCallbackEventsMask = eventFlags;
429*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
430*bebae9c0SAndroid Build Coastguard Worker } else {
431*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
432*bebae9c0SAndroid Build Coastguard Worker }
433*bebae9c0SAndroid Build Coastguard Worker interface_unlock_exclusive(thiz);
434*bebae9c0SAndroid Build Coastguard Worker
435*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
436*bebae9c0SAndroid Build Coastguard Worker }
437*bebae9c0SAndroid Build Coastguard Worker
438*bebae9c0SAndroid Build Coastguard Worker
IAndroidBufferQueue_GetCallbackEventsMask(SLAndroidBufferQueueItf self,SLuint32 * pEventFlags)439*bebae9c0SAndroid Build Coastguard Worker static SLresult IAndroidBufferQueue_GetCallbackEventsMask(SLAndroidBufferQueueItf self,
440*bebae9c0SAndroid Build Coastguard Worker SLuint32 *pEventFlags)
441*bebae9c0SAndroid Build Coastguard Worker {
442*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
443*bebae9c0SAndroid Build Coastguard Worker
444*bebae9c0SAndroid Build Coastguard Worker if (NULL == pEventFlags) {
445*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
446*bebae9c0SAndroid Build Coastguard Worker } else {
447*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue *thiz = (IAndroidBufferQueue *) self;
448*bebae9c0SAndroid Build Coastguard Worker interface_lock_shared(thiz);
449*bebae9c0SAndroid Build Coastguard Worker SLuint32 callbackEventsMask = thiz->mCallbackEventsMask;
450*bebae9c0SAndroid Build Coastguard Worker interface_unlock_shared(thiz);
451*bebae9c0SAndroid Build Coastguard Worker *pEventFlags = callbackEventsMask;
452*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
453*bebae9c0SAndroid Build Coastguard Worker }
454*bebae9c0SAndroid Build Coastguard Worker
455*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
456*bebae9c0SAndroid Build Coastguard Worker }
457*bebae9c0SAndroid Build Coastguard Worker
458*bebae9c0SAndroid Build Coastguard Worker
459*bebae9c0SAndroid Build Coastguard Worker static const struct SLAndroidBufferQueueItf_ IAndroidBufferQueue_Itf = {
460*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue_RegisterCallback,
461*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue_Clear,
462*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue_Enqueue,
463*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue_GetState,
464*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue_SetCallbackEventsMask,
465*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue_GetCallbackEventsMask
466*bebae9c0SAndroid Build Coastguard Worker };
467*bebae9c0SAndroid Build Coastguard Worker
468*bebae9c0SAndroid Build Coastguard Worker
IAndroidBufferQueue_init(void * self)469*bebae9c0SAndroid Build Coastguard Worker void IAndroidBufferQueue_init(void *self)
470*bebae9c0SAndroid Build Coastguard Worker {
471*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue *thiz = (IAndroidBufferQueue *) self;
472*bebae9c0SAndroid Build Coastguard Worker thiz->mItf = &IAndroidBufferQueue_Itf;
473*bebae9c0SAndroid Build Coastguard Worker
474*bebae9c0SAndroid Build Coastguard Worker thiz->mState.count = 0;
475*bebae9c0SAndroid Build Coastguard Worker thiz->mState.index = 0;
476*bebae9c0SAndroid Build Coastguard Worker
477*bebae9c0SAndroid Build Coastguard Worker thiz->mCallback = NULL;
478*bebae9c0SAndroid Build Coastguard Worker thiz->mContext = NULL;
479*bebae9c0SAndroid Build Coastguard Worker thiz->mCallbackEventsMask = SL_ANDROIDBUFFERQUEUEEVENT_PROCESSED;
480*bebae9c0SAndroid Build Coastguard Worker
481*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferType = kAndroidBufferTypeInvalid;
482*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferArray = NULL;
483*bebae9c0SAndroid Build Coastguard Worker thiz->mFront = NULL;
484*bebae9c0SAndroid Build Coastguard Worker thiz->mRear = NULL;
485*bebae9c0SAndroid Build Coastguard Worker thiz->mEOS = false;
486*bebae9c0SAndroid Build Coastguard Worker }
487*bebae9c0SAndroid Build Coastguard Worker
488*bebae9c0SAndroid Build Coastguard Worker
IAndroidBufferQueue_deinit(void * self)489*bebae9c0SAndroid Build Coastguard Worker void IAndroidBufferQueue_deinit(void *self)
490*bebae9c0SAndroid Build Coastguard Worker {
491*bebae9c0SAndroid Build Coastguard Worker IAndroidBufferQueue *thiz = (IAndroidBufferQueue *) self;
492*bebae9c0SAndroid Build Coastguard Worker if (NULL != thiz->mBufferArray) {
493*bebae9c0SAndroid Build Coastguard Worker free(thiz->mBufferArray);
494*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferArray = NULL;
495*bebae9c0SAndroid Build Coastguard Worker }
496*bebae9c0SAndroid Build Coastguard Worker }
497*bebae9c0SAndroid Build Coastguard Worker
498*bebae9c0SAndroid Build Coastguard Worker
499*bebae9c0SAndroid Build Coastguard Worker #if 0
500*bebae9c0SAndroid Build Coastguard Worker // Dump the contents of an IAndroidBufferQueue to the log. This is for debugging only,
501*bebae9c0SAndroid Build Coastguard Worker // and is not a documented API. The associated object is locked throughout for atomicity,
502*bebae9c0SAndroid Build Coastguard Worker // but the log entries may be interspersed with unrelated logs.
503*bebae9c0SAndroid Build Coastguard Worker
504*bebae9c0SAndroid Build Coastguard Worker void IAndroidBufferQueue_log(IAndroidBufferQueue *thiz)
505*bebae9c0SAndroid Build Coastguard Worker {
506*bebae9c0SAndroid Build Coastguard Worker interface_lock_shared(thiz);
507*bebae9c0SAndroid Build Coastguard Worker SL_LOGI("IAndroidBufferQueue %p:", thiz);
508*bebae9c0SAndroid Build Coastguard Worker SL_LOGI(" mState.count=%u mState.index=%u mCallback=%p mContext=%p",
509*bebae9c0SAndroid Build Coastguard Worker thiz->mState.count, thiz->mState.index, thiz->mCallback, thiz->mContext);
510*bebae9c0SAndroid Build Coastguard Worker const char *bufferTypeString;
511*bebae9c0SAndroid Build Coastguard Worker switch (thiz->mBufferType) {
512*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeInvalid:
513*bebae9c0SAndroid Build Coastguard Worker bufferTypeString = "kAndroidBufferTypeInvalid";
514*bebae9c0SAndroid Build Coastguard Worker break;
515*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeMpeg2Ts:
516*bebae9c0SAndroid Build Coastguard Worker bufferTypeString = "kAndroidBufferTypeMpeg2Ts";
517*bebae9c0SAndroid Build Coastguard Worker break;
518*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeAacadts:
519*bebae9c0SAndroid Build Coastguard Worker bufferTypeString = "kAndroidBufferTypeAacadts";
520*bebae9c0SAndroid Build Coastguard Worker break;
521*bebae9c0SAndroid Build Coastguard Worker default:
522*bebae9c0SAndroid Build Coastguard Worker bufferTypeString = "unknown";
523*bebae9c0SAndroid Build Coastguard Worker break;
524*bebae9c0SAndroid Build Coastguard Worker }
525*bebae9c0SAndroid Build Coastguard Worker SL_LOGI(" mCallbackEventsMask=0x%x, mBufferType=0x%x (%s), mEOS=%s",
526*bebae9c0SAndroid Build Coastguard Worker thiz->mCallbackEventsMask,
527*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferType, bufferTypeString,
528*bebae9c0SAndroid Build Coastguard Worker thiz->mEOS ? "true" : "false");
529*bebae9c0SAndroid Build Coastguard Worker SL_LOGI(" mBufferArray=%p, mFront=%p (%u), mRear=%p (%u)",
530*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferArray,
531*bebae9c0SAndroid Build Coastguard Worker thiz->mFront, thiz->mFront - thiz->mBufferArray,
532*bebae9c0SAndroid Build Coastguard Worker thiz->mRear, thiz->mRear - thiz->mBufferArray);
533*bebae9c0SAndroid Build Coastguard Worker SL_LOGI(" index mDataBuffer mDataSize mDataSizeConsumed mBufferContext mItems");
534*bebae9c0SAndroid Build Coastguard Worker const AdvancedBufferHeader *hdr;
535*bebae9c0SAndroid Build Coastguard Worker for (hdr = thiz->mFront; hdr != thiz->mRear; ) {
536*bebae9c0SAndroid Build Coastguard Worker SLuint32 i = hdr - thiz->mBufferArray;
537*bebae9c0SAndroid Build Coastguard Worker char itemString[32];
538*bebae9c0SAndroid Build Coastguard Worker switch (thiz->mBufferType) {
539*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeMpeg2Ts:
540*bebae9c0SAndroid Build Coastguard Worker switch (hdr->mItems.mTsCmdData.mTsCmdCode) {
541*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_NONE:
542*bebae9c0SAndroid Build Coastguard Worker strcpy(itemString, "NONE");
543*bebae9c0SAndroid Build Coastguard Worker break;
544*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_EOS:
545*bebae9c0SAndroid Build Coastguard Worker strcpy(itemString, "EOS");
546*bebae9c0SAndroid Build Coastguard Worker break;
547*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_DISCONTINUITY:
548*bebae9c0SAndroid Build Coastguard Worker strcpy(itemString, "DISCONTINUITY");
549*bebae9c0SAndroid Build Coastguard Worker break;
550*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_DISCON_NEWPTS:
551*bebae9c0SAndroid Build Coastguard Worker snprintf(itemString, sizeof(itemString), "NEWPTS %llu",
552*bebae9c0SAndroid Build Coastguard Worker hdr->mItems.mTsCmdData.mPts);
553*bebae9c0SAndroid Build Coastguard Worker break;
554*bebae9c0SAndroid Build Coastguard Worker case ANDROID_MP2TSEVENT_FORMAT_CHANGE:
555*bebae9c0SAndroid Build Coastguard Worker strcpy(itemString, "FORMAT_CHANGE");
556*bebae9c0SAndroid Build Coastguard Worker break;
557*bebae9c0SAndroid Build Coastguard Worker default:
558*bebae9c0SAndroid Build Coastguard Worker snprintf(itemString, sizeof(itemString), "0x%x", hdr->mItems.mTsCmdData.mTsCmdCode);
559*bebae9c0SAndroid Build Coastguard Worker break;
560*bebae9c0SAndroid Build Coastguard Worker }
561*bebae9c0SAndroid Build Coastguard Worker break;
562*bebae9c0SAndroid Build Coastguard Worker case kAndroidBufferTypeAacadts:
563*bebae9c0SAndroid Build Coastguard Worker switch (hdr->mItems.mAdtsCmdData.mAdtsCmdCode) {
564*bebae9c0SAndroid Build Coastguard Worker case ANDROID_ADTSEVENT_NONE:
565*bebae9c0SAndroid Build Coastguard Worker strcpy(itemString, "NONE");
566*bebae9c0SAndroid Build Coastguard Worker break;
567*bebae9c0SAndroid Build Coastguard Worker case ANDROID_ADTSEVENT_EOS:
568*bebae9c0SAndroid Build Coastguard Worker strcpy(itemString, "EOS");
569*bebae9c0SAndroid Build Coastguard Worker break;
570*bebae9c0SAndroid Build Coastguard Worker default:
571*bebae9c0SAndroid Build Coastguard Worker snprintf(itemString, sizeof(itemString), "0x%x",
572*bebae9c0SAndroid Build Coastguard Worker hdr->mItems.mAdtsCmdData.mAdtsCmdCode);
573*bebae9c0SAndroid Build Coastguard Worker break;
574*bebae9c0SAndroid Build Coastguard Worker }
575*bebae9c0SAndroid Build Coastguard Worker break;
576*bebae9c0SAndroid Build Coastguard Worker default:
577*bebae9c0SAndroid Build Coastguard Worker strcpy(itemString, "");
578*bebae9c0SAndroid Build Coastguard Worker break;
579*bebae9c0SAndroid Build Coastguard Worker }
580*bebae9c0SAndroid Build Coastguard Worker SL_LOGI(" %5u %11p %9u %17u %14p %s",
581*bebae9c0SAndroid Build Coastguard Worker i, hdr->mDataBuffer, hdr->mDataSize, hdr->mDataSizeConsumed,
582*bebae9c0SAndroid Build Coastguard Worker hdr->mBufferContext, itemString);
583*bebae9c0SAndroid Build Coastguard Worker // mBufferState
584*bebae9c0SAndroid Build Coastguard Worker if (++hdr == &thiz->mBufferArray[thiz->mNumBuffers + 1]) {
585*bebae9c0SAndroid Build Coastguard Worker hdr = thiz->mBufferArray;
586*bebae9c0SAndroid Build Coastguard Worker }
587*bebae9c0SAndroid Build Coastguard Worker }
588*bebae9c0SAndroid Build Coastguard Worker interface_unlock_shared(thiz);
589*bebae9c0SAndroid Build Coastguard Worker }
590*bebae9c0SAndroid Build Coastguard Worker
591*bebae9c0SAndroid Build Coastguard Worker #endif
592