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
2339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/ADebug.h>
2439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/ALooper.h>
2539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/DataSource.h>
2639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/MetaData.h>
2739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/OMXClient.h>
2839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/OMXCodec.h>
2939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/base64.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    DataSource::RegisterDefaultSniffers();
4139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
4239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    const char *rtpFilename = NULL;
4339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    const char *rtcpFilename = NULL;
4439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
4539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    if (argc == 3) {
4639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtpFilename = argv[1];
4739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtcpFilename = argv[2];
4839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    } else if (argc != 1) {
4939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        fprintf(stderr, "usage: %s [ rtpFilename rtcpFilename ]\n", argv[0]);
5039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        return 1;
5139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
5239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
5339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0
5439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const uint8_t kSPS[] = {
5539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        0x67, 0x42, 0x80, 0x0a, 0xe9, 0x02, 0x83, 0xe4, 0x20, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x0e, 0xa6, 0x00, 0x80
5639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    };
5739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const uint8_t kPPS[] = {
5839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        0x68, 0xce, 0x3c, 0x80
5939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    };
6039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    AString out1, out2;
6139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    encodeBase64(kSPS, sizeof(kSPS), &out1);
6239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    encodeBase64(kPPS, sizeof(kPPS), &out2);
6339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    printf("params=%s,%s\n", out1.c_str(), out2.c_str());
6439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
6539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
6639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<ALooper> looper = new ALooper;
6739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
6839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<UDPPusher> rtp_pusher;
6939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<UDPPusher> rtcp_pusher;
7039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
7139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    if (rtpFilename != NULL) {
7239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtp_pusher = new UDPPusher(rtpFilename, 5434);
7339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        looper->registerHandler(rtp_pusher);
7439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
7539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtcp_pusher = new UDPPusher(rtcpFilename, 5435);
7639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        looper->registerHandler(rtcp_pusher);
7739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
7839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
7939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<ARTPSession> session = new ARTPSession;
8039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    looper->registerHandler(session);
8139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
8239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0
8339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // My H264 SDP
8439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
8539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
8639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
8739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
8839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
8939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=0-315\r\n"
9039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=isma-compliance:2,2.0,2\r\n"
9139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=video 5434 RTP/AVP 97\r\n"
9239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
9339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:30\r\n"
9439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:97 H264/90000\r\n"
9539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=fmtp:97 packetization-mode=1;profile-level-id=42000C;"
9639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber          "sprop-parameter-sets=Z0IADJZUCg+I,aM44gA==\r\n"
9739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=mpeg4-esid:201\r\n"
9839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=cliprect:0,0,240,320\r\n"
9939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=framesize:97 320-240\r\n";
10039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#elif 0
10139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // My H263 SDP
10239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
10339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
10439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
10539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
10639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
10739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=0-315\r\n"
10839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=isma-compliance:2,2.0,2\r\n"
10939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=video 5434 RTP/AVP 97\r\n"
11039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
11139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:30\r\n"
11239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:97 H263-1998/90000\r\n"
11339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=cliprect:0,0,240,320\r\n"
11439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=framesize:97 320-240\r\n";
11539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#elif 0
11639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // My AMR SDP
11739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
11839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
11939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
12039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
12139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
12239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=0-315\r\n"
12339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=isma-compliance:2,2.0,2\r\n"
12439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=audio 5434 RTP/AVP 97\r\n"
12539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
12639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:30\r\n"
12739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:97 AMR/8000/1\r\n"
12839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=fmtp:97 octet-align\r\n";
12939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#elif 1
13039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // GTalk's H264 SDP
13139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
13239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
13339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
13439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
13539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
13639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=now-\r\n"
13739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=video 5434 RTP/AVP 96\r\n"
13839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
13939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:320000\r\n"
14039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:96 H264/90000\r\n"
14139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=fmtp:96 packetization-mode=1;profile-level-id=42001E;"
14239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber          "sprop-parameter-sets=Z0IAHpZUBaHogA==,aM44gA==\r\n"
14339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=cliprect:0,0,480,270\r\n"
14439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=framesize:96 720-480\r\n";
14539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#else
14639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    // sholes H264 SDP
14739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static const char *raw =
14839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "v=0\r\n"
14939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
15039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "s=QuickTime\r\n"
15139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "t=0 0\r\n"
15239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=range:npt=now-\r\n"
15339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "m=video 5434 RTP/AVP 96\r\n"
15439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "c=IN IP4 127.0.0.1\r\n"
15539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "b=AS:320000\r\n"
15639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=rtpmap:96 H264/90000\r\n"
15739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=fmtp:96 packetization-mode=1;profile-level-id=42001E;"
15839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber          "sprop-parameter-sets=Z0KACukCg+QgAAB9AAAOpgCA,aM48gA==\r\n"
15939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=cliprect:0,0,240,320\r\n"
16039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        "a=framesize:96 320-240\r\n";
16139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
16239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
16339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<ASessionDescription> desc = new ASessionDescription;
16439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK(desc->setTo(raw, strlen(raw)));
16539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
16639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK_EQ(session->setup(desc), (status_t)OK);
16739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
16839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    if (rtp_pusher != NULL) {
16939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtp_pusher->start();
17039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
17139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
17239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    if (rtcp_pusher != NULL) {
17339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        rtcp_pusher->start();
17439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
17539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
17639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    looper->start(false /* runOnCallingThread */);
17739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
17839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK_EQ(session->countTracks(), 1u);
17939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<MediaSource> source = session->trackAt(0);
18039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
18139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    OMXClient client;
18239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK_EQ(client.connect(), (status_t)OK);
18339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
18439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<MediaSource> decoder = OMXCodec::Create(
18539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            client.interface(),
18639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            source->getFormat(), false /* createEncoder */,
18739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            source,
18839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            NULL,
18939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            0);  // OMXCodec::kPreferSoftwareCodecs);
19039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK(decoder != NULL);
19139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
19239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK_EQ(decoder->start(), (status_t)OK);
19339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
19439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    for (;;) {
19539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        MediaBuffer *buffer;
19639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        status_t err = decoder->read(&buffer);
19739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
19839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        if (err != OK) {
19939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            if (err == INFO_FORMAT_CHANGED) {
20039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                int32_t width, height;
20139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                CHECK(decoder->getFormat()->findInt32(kKeyWidth, &width));
20239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                CHECK(decoder->getFormat()->findInt32(kKeyHeight, &height));
20339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                printf("INFO_FORMAT_CHANGED %d x %d\n", width, height);
20439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                continue;
20539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            }
20639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
20729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("decoder returned error 0x%08x", err);
20839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            break;
20939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        }
21039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
21139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 1
21239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        if (buffer->range_length() != 0) {
21339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            int64_t timeUs;
21439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs));
21539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
21639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            printf("decoder returned frame of size %d at time %.2f secs\n",
21739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                   buffer->range_length(), timeUs / 1E6);
21839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        }
21939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
22039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
22139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        buffer->release();
22239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        buffer = NULL;
22339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    }
22439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
22539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    CHECK_EQ(decoder->stop(), (status_t)OK);
22639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
22739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    looper->stop();
22839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
22939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    return 0;
23039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber}
231