1321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi/* 2321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 3321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * 4321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * you may not use this file except in compliance with the License. 6321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * You may obtain a copy of the License at 7321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * 8321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * 10321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * See the License for the specific language governing permissions and 14321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi * limitations under the License. 15321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi */ 16321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 17321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi/* StreamInformation implementation */ 18321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 19321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#include "sles_allinclusive.h" 20321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 21321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivistatic XAresult IStreamInformation_QueryMediaContainerInformation( XAStreamInformationItf self, 22321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAMediaContainerInformation * info /* [out] */) 23321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi{ 24321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_ENTER_INTERFACE 25321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 26cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten if (NULL == info) { 27cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten result = XA_RESULT_PARAMETER_INVALID; 28cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten XA_LEAVE_INTERFACE 29cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten } 30cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten 31321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#ifdef ANDROID 32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IStreamInformation *thiz = (IStreamInformation *) self; 33887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_lock_shared(thiz); 3437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // always storing container info at index 0, as per spec 35cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten *info = thiz->mStreamInfoTable.itemAt(0).containerInfo; 36887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_unlock_shared(thiz); 37321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi // even though the pointer to the media container info is returned, the values aren't set 38321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi // for the actual container in this version, they are simply initialized to defaults 39321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi // (see IStreamInformation_init) 40cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten result = XA_RESULT_SUCCESS; 41321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#else 42321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi SL_LOGE("QueryMediaContainerInformation is unsupported"); 43cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten memset(info, 0, sizeof(XAMediaContainerInformation)); 44887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten result = XA_RESULT_FEATURE_UNSUPPORTED; 45321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#endif 46321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 47321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_LEAVE_INTERFACE 48321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi} 49321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 50321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 51321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivistatic XAresult IStreamInformation_QueryStreamType( XAStreamInformationItf self, 52321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAuint32 streamIndex, /* [in] */ 53321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAuint32 *domain) /* [out] */ 54321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi{ 55321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_ENTER_INTERFACE 56321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 57321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi if (NULL == domain) { 58321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi result = XA_RESULT_PARAMETER_INVALID; 59321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_LEAVE_INTERFACE; 60321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi } 61321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 62321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#ifndef ANDROID 6322ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten *domain = XA_DOMAINTYPE_UNKNOWN; 64321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#else 65321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi if (0 == streamIndex) { 66321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi // stream 0 is reserved for the container 67321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi result = XA_RESULT_PARAMETER_INVALID; 68cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten *domain = XA_DOMAINTYPE_UNKNOWN; 69321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi } else { 70bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IStreamInformation *thiz = (IStreamInformation *) self; 71321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 72887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_lock_shared(thiz); 7337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 74bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams; 75321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi // streams in the container are numbered 1..nbStreams 76321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi if (streamIndex <= nbStreams) { 77321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi result = XA_RESULT_SUCCESS; 78bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten *domain = thiz->mStreamInfoTable.itemAt(streamIndex).domain; 79321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi } else { 80a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten SL_LOGE("Querying stream type for stream %d, only %d streams available", 81321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi streamIndex, nbStreams); 82321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi result = XA_RESULT_PARAMETER_INVALID; 83321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi } 8437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 85887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_unlock_shared(thiz); 86321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi } 87321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#endif 88321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 89321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_LEAVE_INTERFACE 90321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi} 91321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 92321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 93321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivistatic XAresult IStreamInformation_QueryStreamInformation( XAStreamInformationItf self, 94321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAuint32 streamIndex, /* [in] */ 95321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi void * info) /* [out] */ 96321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi{ 97321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_ENTER_INTERFACE 98321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 9937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (NULL == info) { 10037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi result = XA_RESULT_PARAMETER_INVALID; 10137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else { 10237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 10337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi#ifndef ANDROID 10437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi result = XA_RESULT_FEATURE_UNSUPPORTED; 10537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi#else 10637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 10737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi IStreamInformation *thiz = (IStreamInformation *) self; 10837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 109887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_lock_shared(thiz); 11037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 11137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams; 112cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten // stream 0 is the container, and other streams in the container are numbered 1..nbStreams 11337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (streamIndex <= nbStreams) { 11437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi result = XA_RESULT_SUCCESS; 11537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi const StreamInfo& streamInfo = thiz->mStreamInfoTable.itemAt((size_t)streamIndex); 11637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 11737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi switch (streamInfo.domain) { 11837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case XA_DOMAINTYPE_CONTAINER: 11937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi *(XAMediaContainerInformation *)info = streamInfo.containerInfo; 12037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 12137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case XA_DOMAINTYPE_AUDIO: 12237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi *(XAAudioStreamInformation *)info = streamInfo.audioInfo; 12337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 12437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case XA_DOMAINTYPE_VIDEO: 12537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi *(XAVideoStreamInformation *)info = streamInfo.videoInfo; 12637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 12737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case XA_DOMAINTYPE_IMAGE: 12837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi *(XAImageStreamInformation *)info = streamInfo.imageInfo; 12937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 13037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case XA_DOMAINTYPE_TIMEDTEXT: 13137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi *(XATimedTextStreamInformation *)info = streamInfo.textInfo; 13237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 13337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case XA_DOMAINTYPE_MIDI: 13437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi *(XAMIDIStreamInformation *)info = streamInfo.midiInfo; 13537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 13637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case XA_DOMAINTYPE_VENDOR: 13737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi *(XAVendorStreamInformation *)info = streamInfo.vendorInfo; 13837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 13937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi default: 140a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten SL_LOGE("StreamInformation::QueryStreamInformation index %u has " 141a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten "unknown domain %u", streamIndex, streamInfo.domain); 14237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi result = XA_RESULT_INTERNAL_ERROR; 14337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 14437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 14537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 14637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else { 147a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten SL_LOGE("Querying stream type for stream %d, only %d streams available", 14837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi streamIndex, nbStreams); 14937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi result = XA_RESULT_PARAMETER_INVALID; 15037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 15137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 152887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_unlock_shared(thiz); 15337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi#endif 15437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 15537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 156321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 157321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_LEAVE_INTERFACE 158321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi} 159321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 160321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 161321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivistatic XAresult IStreamInformation_QueryStreamName( XAStreamInformationItf self, 162321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAuint32 streamIndex, /* [in] */ 163321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAuint16 * pNameSize, /* [in/out] */ 164321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAchar * pName) /* [out] */ 165321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi{ 166321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_ENTER_INTERFACE 167321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 168887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten if (NULL == pNameSize || streamIndex == 0) { 169887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten result = XA_RESULT_PARAMETER_INVALID; 170887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten } else { 171887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten#ifdef ANDROID 172887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten IStreamInformation *thiz = (IStreamInformation *) self; 173887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_lock_shared(thiz); 174887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten 175887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams; 176887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten // streams in the container are numbered 1..nbStreams 177887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten if (streamIndex <= nbStreams) { 178887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten char streamName[16]; // large enough for the fixed format in next line 179887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten snprintf(streamName, sizeof(streamName), "stream%u", streamIndex); 180887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten size_t actualNameLength = strlen(streamName); 181887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten if (NULL == pName) { 182887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten // application is querying the name length in order to allocate a buffer 183887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten result = XA_RESULT_SUCCESS; 184887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten } else { 185887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten SLuint16 availableNameLength = *pNameSize; 186887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten if (actualNameLength > availableNameLength) { 187887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten memcpy(pName, streamName, availableNameLength); 188887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten result = XA_RESULT_BUFFER_INSUFFICIENT; 189887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten } else if (actualNameLength == availableNameLength) { 190887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten memcpy(pName, streamName, availableNameLength); 191887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten result = XA_RESULT_SUCCESS; 192887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten } else { // actualNameLength < availableNameLength 193887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten memcpy(pName, streamName, actualNameLength + 1); 194887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten result = XA_RESULT_SUCCESS; 195887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten } 196887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten } 197887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten *pNameSize = actualNameLength; 198887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten } else { 199887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten result = XA_RESULT_PARAMETER_INVALID; 200887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten } 201887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten 202887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_unlock_shared(thiz); 203887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten#else 204887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten SL_LOGE("unsupported XAStreamInformationItf function"); 205887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten result = XA_RESULT_FEATURE_UNSUPPORTED; 206887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten#endif 207887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten } 208321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 209321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_LEAVE_INTERFACE 210321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi} 211321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 212321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 213321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivistatic XAresult IStreamInformation_RegisterStreamChangeCallback( XAStreamInformationItf self, 214321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi xaStreamEventChangeCallback callback, /* [in] */ 215321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi void * pContext) /* [in] */ 216321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi{ 217321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_ENTER_INTERFACE 218321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 219bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IStreamInformation *thiz = (IStreamInformation *) self; 220321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 221bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 222321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 223bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mCallback = callback; 224bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mContext = pContext; 225cb441acdda6f8e81d44fcdaadd4ff7ab3d3e367bGlenn Kasten result = SL_RESULT_SUCCESS; 226321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 227bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 228321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 229321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_LEAVE_INTERFACE 230321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi} 231321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 232321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 233321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivistatic XAresult IStreamInformation_QueryActiveStreams( XAStreamInformationItf self, 234321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAuint32 *numStreams, /* [in/out] */ 235321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAboolean *activeStreams) /* [out] */ 236321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi{ 237321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_ENTER_INTERFACE 238321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 239321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi if (NULL == numStreams) { 240321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi result = XA_RESULT_PARAMETER_INVALID; 241321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_LEAVE_INTERFACE; 242321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi } 243321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 244887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten#ifdef ANDROID 24537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi IStreamInformation *thiz = (IStreamInformation *) self; 246887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_lock_shared(thiz); 24737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 24837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi result = XA_RESULT_SUCCESS; 24937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi *numStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams; 250a6585530d8cf92658042c001b6a27fc397c62b9fGlenn Kasten // FIXME not setting activeStreams 25137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 252887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten interface_unlock_shared(thiz); 253887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten#else 254887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 255887b8d1551370e592f527dcba3e76cf6916cf677Glenn Kasten#endif 256321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 257321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_LEAVE_INTERFACE 258321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi} 259321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 260321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 261321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivistatic XAresult IStreamInformation_SetActiveStream( XAStreamInformationItf self, 262321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAuint32 streamNum, /* [in] */ 263321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAboolean active, /* [in] */ 264321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XAboolean commitNow) /* [in] */ 265321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi{ 266321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_ENTER_INTERFACE 267321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 268321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi SL_LOGE("unsupported XAStreamInformationItf function"); 269321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi result = XA_RESULT_FEATURE_UNSUPPORTED; 270321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 271321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi XA_LEAVE_INTERFACE 272321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi} 273321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 274321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 275321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivistatic const struct XAStreamInformationItf_ IStreamInformation_Itf = { 276321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi IStreamInformation_QueryMediaContainerInformation, 277321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi IStreamInformation_QueryStreamType, 278321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi IStreamInformation_QueryStreamInformation, 279321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi IStreamInformation_QueryStreamName, 280321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi IStreamInformation_RegisterStreamChangeCallback, 281321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi IStreamInformation_QueryActiveStreams, 282321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi IStreamInformation_SetActiveStream 283321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi}; 284321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 28537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 286321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivivoid IStreamInformation_init(void *self) 287321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi{ 28837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi SL_LOGV("IStreamInformation_init\n"); 289bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IStreamInformation *thiz = (IStreamInformation *) self; 290bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IStreamInformation_Itf; 291321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 292bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mCallback = NULL; 293bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mContext = NULL; 294321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi 29537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi for (int i=0 ; i < NB_SUPPORTED_STREAMS ; i++) { 29637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi thiz->mActiveStreams[i] = XA_BOOLEAN_FALSE; 29737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 29837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 299321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#ifdef ANDROID 30037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // placement new constructor for C++ field within C struct 3012eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten (void) new (&thiz->mStreamInfoTable) android::Vector<StreamInfo>(); 302321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi // initialize container info 303321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi StreamInfo contInf; 30437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi contInf.domain = XA_DOMAINTYPE_CONTAINER; 305321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi contInf.containerInfo.containerType = XA_CONTAINERTYPE_UNSPECIFIED; 306321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi contInf.containerInfo.mediaDuration = XA_TIME_UNKNOWN; 30737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // FIXME shouldn't this be 1 ? 308321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi contInf.containerInfo.numStreams = 0; 30937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // always storing container info at index 0, as per spec: here, the table was still empty 310bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStreamInfoTable.add(contInf); 311321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#endif 312321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi} 31337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 31437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 31537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid IStreamInformation_deinit(void *self) { 31637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi#ifdef ANDROID 31737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi IStreamInformation *thiz = (IStreamInformation *) self; 31837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // explicit destructor 3192eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten thiz->mStreamInfoTable.~Vector<StreamInfo>(); 32037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi#endif 32137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 322