1871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi/*
2871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project
3871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi *
4871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi * you may not use this file except in compliance with the License.
6871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi * You may obtain a copy of the License at
7871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi *
8871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi *
10871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi * See the License for the specific language governing permissions and
14871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi * limitations under the License.
15871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi */
16871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
17871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi/* StreamInformation implementation */
18871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
19871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi#include "sles_allinclusive.h"
20871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
21871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivistatic XAresult IStreamInformation_QueryMediaContainerInformation( XAStreamInformationItf self,
22871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAMediaContainerInformation * info /* [out] */)
23871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi{
24871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_ENTER_INTERFACE
25871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
26a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten    if (NULL == info) {
27a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten        result = XA_RESULT_PARAMETER_INVALID;
28a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten        XA_LEAVE_INTERFACE
29a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten    }
30a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten
31871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi#ifdef ANDROID
3250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    IStreamInformation *thiz = (IStreamInformation *) self;
3350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    interface_lock_exclusive(thiz);
34fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // always storing container info at index 0, as per spec
35a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten    *info = thiz->mStreamInfoTable.itemAt(0).containerInfo;
3650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    interface_unlock_exclusive(thiz);
37871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    // even though the pointer to the media container info is returned, the values aren't set
38871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    //  for the actual container in this version, they are simply initialized to defaults
39871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    //  (see IStreamInformation_init)
40a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten    result = XA_RESULT_SUCCESS;
41871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi#else
42871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    SL_LOGE("QueryMediaContainerInformation is unsupported");
43a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten    memset(info, 0, sizeof(XAMediaContainerInformation));
44871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    result = XA_RESULT_CONTENT_UNSUPPORTED;
45871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi#endif
46871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
47871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_LEAVE_INTERFACE
48871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi}
49871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
50871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
51871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivistatic XAresult IStreamInformation_QueryStreamType( XAStreamInformationItf self,
52871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAuint32 streamIndex, /* [in] */
53871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAuint32 *domain)     /* [out] */
54871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi{
55871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_ENTER_INTERFACE
56871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
57871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    if (NULL == domain) {
58871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
59871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XA_LEAVE_INTERFACE;
60871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    }
61871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
62871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi#ifndef ANDROID
63871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    *domain =  XA_DOMAINTYPE_UNKNOWN;
64871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi#else
65871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    if (0 == streamIndex) {
66871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        // stream 0 is reserved for the container
67871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
68a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten        *domain = XA_DOMAINTYPE_UNKNOWN;
69871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    } else {
7050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IStreamInformation *thiz = (IStreamInformation *) self;
71871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
7250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
73fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
7450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
75871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        // streams in the container are numbered 1..nbStreams
76871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        if (streamIndex <= nbStreams) {
77871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi            result = XA_RESULT_SUCCESS;
7850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            *domain = thiz->mStreamInfoTable.itemAt(streamIndex).domain;
79871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        } else {
801c17ec55f629fdab909ab16d94e014f098369110Glenn Kasten            SL_LOGE("Querying stream type for stream %d, only %d streams available",
81871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi                    streamIndex, nbStreams);
82871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi            result = XA_RESULT_PARAMETER_INVALID;
83871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        }
84fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
8550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
86871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    }
87871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi#endif
88871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
89871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_LEAVE_INTERFACE
90871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi}
91871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
92871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
93871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivistatic XAresult IStreamInformation_QueryStreamInformation( XAStreamInformationItf self,
94871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAuint32 streamIndex, /* [in] */
95871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        void * info)          /* [out] */
96871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi{
97871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_ENTER_INTERFACE
98871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
99fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    if (NULL == info) {
100fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
101fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    } else {
102fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
103fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi#ifndef ANDROID
104fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        result = XA_RESULT_FEATURE_UNSUPPORTED;
105fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi#else
106fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
107fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        IStreamInformation *thiz = (IStreamInformation *) self;
108fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
109fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        interface_lock_exclusive(thiz);
110fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
111fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
112a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten        // stream 0 is the container, and other streams in the container are numbered 1..nbStreams
113fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        if (streamIndex <= nbStreams) {
114fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            result = XA_RESULT_SUCCESS;
115fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            const StreamInfo& streamInfo = thiz->mStreamInfoTable.itemAt((size_t)streamIndex);
116fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
117fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            switch (streamInfo.domain) {
118fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            case XA_DOMAINTYPE_CONTAINER:
119fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                *(XAMediaContainerInformation *)info = streamInfo.containerInfo;
120fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                break;
121fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            case XA_DOMAINTYPE_AUDIO:
122fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                *(XAAudioStreamInformation *)info = streamInfo.audioInfo;
123fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                break;
124fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            case XA_DOMAINTYPE_VIDEO:
125fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                *(XAVideoStreamInformation *)info = streamInfo.videoInfo;
126fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                break;
127fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            case XA_DOMAINTYPE_IMAGE:
128fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                *(XAImageStreamInformation *)info = streamInfo.imageInfo;
129fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                break;
130fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            case XA_DOMAINTYPE_TIMEDTEXT:
131fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                *(XATimedTextStreamInformation *)info = streamInfo.textInfo;
132fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                break;
133fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            case XA_DOMAINTYPE_MIDI:
134fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                *(XAMIDIStreamInformation *)info = streamInfo.midiInfo;
135fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                break;
136fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            case XA_DOMAINTYPE_VENDOR:
137fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                *(XAVendorStreamInformation *)info = streamInfo.vendorInfo;
138fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                break;
139fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            default:
1401c17ec55f629fdab909ab16d94e014f098369110Glenn Kasten                SL_LOGE("StreamInformation::QueryStreamInformation index %u has "
1411c17ec55f629fdab909ab16d94e014f098369110Glenn Kasten                        "unknown domain %u", streamIndex, streamInfo.domain);
142fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                result = XA_RESULT_INTERNAL_ERROR;
143fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                break;
144fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            }
145fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
146fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        } else {
1471c17ec55f629fdab909ab16d94e014f098369110Glenn Kasten            SL_LOGE("Querying stream type for stream %d, only %d streams available",
148fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                    streamIndex, nbStreams);
149fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            result = XA_RESULT_PARAMETER_INVALID;
150fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        }
151fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
152fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        interface_unlock_exclusive(thiz);
153fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi#endif
154fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
155fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    }
156871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
157871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_LEAVE_INTERFACE
158871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi}
159871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
160871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
161871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivistatic XAresult IStreamInformation_QueryStreamName( XAStreamInformationItf self,
162871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAuint32 streamIndex, /* [in] */
163871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAuint16 * pNameSize, /* [in/out] */
164871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAchar * pName)       /* [out] */
165871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi{
166871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_ENTER_INTERFACE
167871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
168871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    SL_LOGE("unsupported XAStreamInformationItf function");
169a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten    result = XA_RESULT_FEATURE_UNSUPPORTED;
170871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
171871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_LEAVE_INTERFACE
172871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi}
173871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
174871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
175871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivistatic XAresult IStreamInformation_RegisterStreamChangeCallback( XAStreamInformationItf self,
176871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        xaStreamEventChangeCallback callback, /* [in] */
177871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        void * pContext)                      /* [in] */
178871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi{
179871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_ENTER_INTERFACE
180871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
18150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    IStreamInformation *thiz = (IStreamInformation *) self;
182871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
18350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    interface_lock_exclusive(thiz);
184871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
18550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mCallback = callback;
18650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mContext = pContext;
187a51725b1ff3abcd30c929a014e3961df2c0fb8a4Glenn Kasten    result = SL_RESULT_SUCCESS;
188871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
18950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    interface_unlock_exclusive(thiz);
190871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
191871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_LEAVE_INTERFACE
192871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi}
193871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
194871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
195871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivistatic XAresult IStreamInformation_QueryActiveStreams( XAStreamInformationItf self,
196871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAuint32 *numStreams,      /* [in/out] */
197871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAboolean *activeStreams)  /* [out] */
198871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi{
199871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_ENTER_INTERFACE
200871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
201871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    if (NULL == numStreams) {
202871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
203871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XA_LEAVE_INTERFACE;
204871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    }
205871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
206fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    IStreamInformation *thiz = (IStreamInformation *) self;
207fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
208fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    interface_lock_exclusive(thiz);
209fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
210fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    result = XA_RESULT_SUCCESS;
211fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    *numStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
212fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    activeStreams = thiz->mActiveStreams;
213fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
214fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    interface_unlock_exclusive(thiz);
215871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
216871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_LEAVE_INTERFACE
217871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi}
218871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
219871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
220871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivistatic XAresult IStreamInformation_SetActiveStream( XAStreamInformationItf self,
221871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAuint32   streamNum, /* [in] */
222871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAboolean  active,    /* [in] */
223871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi        XAboolean  commitNow) /* [in] */
224871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi{
225871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_ENTER_INTERFACE
226871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
227871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    SL_LOGE("unsupported XAStreamInformationItf function");
228871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    result = XA_RESULT_FEATURE_UNSUPPORTED;
229871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
230871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    XA_LEAVE_INTERFACE
231871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi}
232871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
233871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
234871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivistatic const struct XAStreamInformationItf_ IStreamInformation_Itf = {
235871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    IStreamInformation_QueryMediaContainerInformation,
236871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    IStreamInformation_QueryStreamType,
237871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    IStreamInformation_QueryStreamInformation,
238871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    IStreamInformation_QueryStreamName,
239871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    IStreamInformation_RegisterStreamChangeCallback,
240871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    IStreamInformation_QueryActiveStreams,
241871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    IStreamInformation_SetActiveStream
242871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi};
243871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
244fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
245871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivivoid IStreamInformation_init(void *self)
246871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi{
247fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    SL_LOGV("IStreamInformation_init\n");
24850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    IStreamInformation *thiz = (IStreamInformation *) self;
24950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mItf = &IStreamInformation_Itf;
250871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
25150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mCallback = NULL;
25250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mContext = NULL;
253871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi
254fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    for (int i=0 ; i < NB_SUPPORTED_STREAMS ; i++) {
255fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        thiz->mActiveStreams[i] = XA_BOOLEAN_FALSE;
256fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    }
257fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
258871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi#ifdef ANDROID
259fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // placement new constructor for C++ field within C struct
2602e28af68bc8807958ba611c082a0a61691e76a2cGlenn Kasten    (void) new (&thiz->mStreamInfoTable) android::Vector<StreamInfo>();
261871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    // initialize container info
262871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    StreamInfo contInf;
263fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    contInf.domain = XA_DOMAINTYPE_CONTAINER;
264871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    contInf.containerInfo.containerType = XA_CONTAINERTYPE_UNSPECIFIED;
265871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    contInf.containerInfo.mediaDuration = XA_TIME_UNKNOWN;
266fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // FIXME shouldn't this be 1 ?
267871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi    contInf.containerInfo.numStreams = 0;
268fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // always storing container info at index 0, as per spec: here, the table was still empty
26950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mStreamInfoTable.add(contInf);
270871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi#endif
271871ed9a3f3fff7ea1392c5da8f475144a6e431b3Jean-Michel Trivi}
272fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
273fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
274fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivivoid IStreamInformation_deinit(void *self) {
275fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi#ifdef ANDROID
276fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    IStreamInformation *thiz = (IStreamInformation *) self;
277fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // explicit destructor
2782e28af68bc8807958ba611c082a0a61691e76a2cGlenn Kasten    thiz->mStreamInfoTable.~Vector<StreamInfo>();
279fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi#endif
280fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi}
281