139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber/*
239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * Copyright (C) 2010 The Android Open Source Project
339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber *
439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * you may not use this file except in compliance with the License.
639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * You may obtain a copy of the License at
739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber *
839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber *
1039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * Unless required by applicable law or agreed to in writing, software
1139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * See the License for the specific language governing permissions and
1439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * limitations under the License.
1539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber */
1639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber//#define LOG_NDEBUG 0
186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define LOG_TAG "rtp_test"
196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#include <utils/Log.h>
206e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber
2139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <binder/ProcessState.h>
2239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
23a2b4bcf6562de3f8528fc139ec202bd73fa340c7Lajos Molnar#include <media/stagefright/foundation/base64.h>
2439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/ADebug.h>
2539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/ALooper.h>
2639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/DataSource.h>
27a2b4bcf6562de3f8528fc139ec202bd73fa340c7Lajos Molnar#include <media/stagefright/MediaBuffer.h>
2839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/MetaData.h>
29a2b4bcf6562de3f8528fc139ec202bd73fa340c7Lajos Molnar#include <media/stagefright/SimpleDecodingSource.h>
3039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
3139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "ARTPSession.h"
3239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "ASessionDescription.h"
3339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "UDPPusher.h"
3439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
3539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberusing namespace android;
3639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
3739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberint main(int argc, char **argv) {
3839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    android::ProcessState::self()->startThreadPool();
3939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
4039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    const char *rtpFilename = NULL;
4139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    const char *rtcpFilename = NULL;
4239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
4339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    if (argc == 3) {
4439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtpFilename = argv[1];
4539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtcpFilename = argv[2];
4639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    } else if (argc != 1) {
4739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        fprintf(stderr, "usage: %s [ rtpFilename rtcpFilename ]\n", argv[0]);
4839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        return 1;
4939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
5039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
5139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0
5239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const uint8_t kSPS[] = {
5339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        0x67, 0x42, 0x80, 0x0a, 0xe9, 0x02, 0x83, 0xe4, 0x20, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x0e, 0xa6, 0x00, 0x80
5439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    };
5539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const uint8_t kPPS[] = {
5639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        0x68, 0xce, 0x3c, 0x80
5739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    };
5839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    AString out1, out2;
5939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    encodeBase64(kSPS, sizeof(kSPS), &out1);
6039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    encodeBase64(kPPS, sizeof(kPPS), &out2);
6139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    printf("params=%s,%s\n", out1.c_str(), out2.c_str());
6239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
6339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
6439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<ALooper> looper = new ALooper;
6539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
6639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<UDPPusher> rtp_pusher;
6739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<UDPPusher> rtcp_pusher;
6839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
6939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    if (rtpFilename != NULL) {
7039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtp_pusher = new UDPPusher(rtpFilename, 5434);
7139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        looper->registerHandler(rtp_pusher);
7239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
7339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtcp_pusher = new UDPPusher(rtcpFilename, 5435);
7439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        looper->registerHandler(rtcp_pusher);
7539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
7639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
7739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<ARTPSession> session = new ARTPSession;
7839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    looper->registerHandler(session);
7939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
8039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0
8139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // My H264 SDP
8239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
8339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
8439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
8539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
8639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
8739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=0-315\r\n"
8839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=isma-compliance:2,2.0,2\r\n"
8939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=video 5434 RTP/AVP 97\r\n"
9039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
9139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:30\r\n"
9239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:97 H264/90000\r\n"
9339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=fmtp:97 packetization-mode=1;profile-level-id=42000C;"
9439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber          "sprop-parameter-sets=Z0IADJZUCg+I,aM44gA==\r\n"
9539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=mpeg4-esid:201\r\n"
9639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=cliprect:0,0,240,320\r\n"
9739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=framesize:97 320-240\r\n";
9839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#elif 0
9939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // My H263 SDP
10039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
10139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
10239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
10339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
10439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
10539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=0-315\r\n"
10639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=isma-compliance:2,2.0,2\r\n"
10739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=video 5434 RTP/AVP 97\r\n"
10839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
10939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:30\r\n"
11039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:97 H263-1998/90000\r\n"
11139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=cliprect:0,0,240,320\r\n"
11239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=framesize:97 320-240\r\n";
11339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#elif 0
11439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // My AMR SDP
11539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
11639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
11739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
11839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
11939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
12039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=0-315\r\n"
12139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=isma-compliance:2,2.0,2\r\n"
12239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=audio 5434 RTP/AVP 97\r\n"
12339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
12439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:30\r\n"
12539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:97 AMR/8000/1\r\n"
12639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=fmtp:97 octet-align\r\n";
12739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#elif 1
12839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // GTalk's H264 SDP
12939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
13039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
13139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
13239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
13339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
13439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=now-\r\n"
13539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=video 5434 RTP/AVP 96\r\n"
13639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
13739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:320000\r\n"
13839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:96 H264/90000\r\n"
13939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=fmtp:96 packetization-mode=1;profile-level-id=42001E;"
14039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber          "sprop-parameter-sets=Z0IAHpZUBaHogA==,aM44gA==\r\n"
14139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=cliprect:0,0,480,270\r\n"
14239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=framesize:96 720-480\r\n";
14339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#else
14439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // sholes H264 SDP
14539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
14639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
14739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
14839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
14939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
15039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=now-\r\n"
15139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=video 5434 RTP/AVP 96\r\n"
15239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
15339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:320000\r\n"
15439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:96 H264/90000\r\n"
15539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=fmtp:96 packetization-mode=1;profile-level-id=42001E;"
15639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber          "sprop-parameter-sets=Z0KACukCg+QgAAB9AAAOpgCA,aM48gA==\r\n"
15739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=cliprect:0,0,240,320\r\n"
15839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=framesize:96 320-240\r\n";
15939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
16039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
16139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<ASessionDescription> desc = new ASessionDescription;
16239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK(desc->setTo(raw, strlen(raw)));
16339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
16439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK_EQ(session->setup(desc), (status_t)OK);
16539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
16639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    if (rtp_pusher != NULL) {
16739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtp_pusher->start();
16839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
16939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
17039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    if (rtcp_pusher != NULL) {
17139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtcp_pusher->start();
17239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
17339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
17439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    looper->start(false /* runOnCallingThread */);
17539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
17639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK_EQ(session->countTracks(), 1u);
17739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<MediaSource> source = session->trackAt(0);
17839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
179a2b4bcf6562de3f8528fc139ec202bd73fa340c7Lajos Molnar    sp<MediaSource> decoder = SimpleDecodingSource::Create(
180a2b4bcf6562de3f8528fc139ec202bd73fa340c7Lajos Molnar            source, 0 /* flags: ACodec::kPreferSoftwareCodecs */);
18139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK(decoder != NULL);
18239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
18339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK_EQ(decoder->start(), (status_t)OK);
18439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
18539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    for (;;) {
18639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        MediaBuffer *buffer;
18739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        status_t err = decoder->read(&buffer);
18839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
18939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        if (err != OK) {
19039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            if (err == INFO_FORMAT_CHANGED) {
19139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                int32_t width, height;
19239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                CHECK(decoder->getFormat()->findInt32(kKeyWidth, &width));
19339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                CHECK(decoder->getFormat()->findInt32(kKeyHeight, &height));
19439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                printf("INFO_FORMAT_CHANGED %d x %d\n", width, height);
19539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                continue;
19639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            }
19739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
19829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("decoder returned error 0x%08x", err);
19939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            break;
20039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        }
20139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
20239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 1
20339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        if (buffer->range_length() != 0) {
20439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            int64_t timeUs;
20539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs));
20639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
207a2b4bcf6562de3f8528fc139ec202bd73fa340c7Lajos Molnar            printf("decoder returned frame of size %zu at time %.2f secs\n",
20839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                   buffer->range_length(), timeUs / 1E6);
20939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        }
21039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
21139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
21239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        buffer->release();
21339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        buffer = NULL;
21439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
21539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
21639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK_EQ(decoder->stop(), (status_t)OK);
21739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
21839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    looper->stop();
21939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
22039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    return 0;
22139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber}
222