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