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