rtp_test.cpp revision 92d57f926eb39d72e8fd8f3b3c9e40d25f77ad47
1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License.
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License.
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project//#define LOG_NDEBUG 0
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LOG_TAG "rtp_test"
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <utils/Log.h>
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <binder/ProcessState.h>
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <media/stagefright/foundation/base64.h>
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <media/stagefright/foundation/ADebug.h>
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <media/stagefright/foundation/ALooper.h>
265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include <media/stagefright/DataSource.h>
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <media/stagefright/MediaBuffer.h>
286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <media/stagefright/MetaData.h>
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <media/stagefright/SimpleDecodingSource.h>
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ARTPSession.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ASessionDescription.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "UDPPusher.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiusing namespace android;
366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint main(int argc, char **argv) {
386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    android::ProcessState::self()->startThreadPool();
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char *rtpFilename = NULL;
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char *rtcpFilename = NULL;
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (argc == 3) {
446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rtpFilename = argv[1];
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rtcpFilename = argv[2];
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    } else if (argc != 1) {
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        fprintf(stderr, "usage: %s [ rtpFilename rtcpFilename ]\n", argv[0]);
486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return 1;
496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if 0
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    static const uint8_t kSPS[] = {
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        0x67, 0x42, 0x80, 0x0a, 0xe9, 0x02, 0x83, 0xe4, 0x20, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x0e, 0xa6, 0x00, 0x80
546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    };
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    static const uint8_t kPPS[] = {
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        0x68, 0xce, 0x3c, 0x80
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    };
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    AString out1, out2;
596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    encodeBase64(kSPS, sizeof(kSPS), &out1);
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    encodeBase64(kPPS, sizeof(kPPS), &out2);
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    printf("params=%s,%s\n", out1.c_str(), out2.c_str());
626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif
636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sp<ALooper> looper = new ALooper;
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sp<UDPPusher> rtp_pusher;
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sp<UDPPusher> rtcp_pusher;
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rtpFilename != NULL) {
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rtp_pusher = new UDPPusher(rtpFilename, 5434);
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        looper->registerHandler(rtp_pusher);
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rtcp_pusher = new UDPPusher(rtcpFilename, 5435);
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        looper->registerHandler(rtcp_pusher);
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sp<ARTPSession> session = new ARTPSession;
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    looper->registerHandler(session);
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if 0
816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    // My H264 SDP
826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    static const char *raw =
836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "v=0\r\n"
846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "s=QuickTime\r\n"
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "t=0 0\r\n"
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "a=range:npt=0-315\r\n"
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "a=isma-compliance:2,2.0,2\r\n"
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "m=video 5434 RTP/AVP 97\r\n"
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "c=IN IP4 127.0.0.1\r\n"
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "b=AS:30\r\n"
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "a=rtpmap:97 H264/90000\r\n"
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "a=fmtp:97 packetization-mode=1;profile-level-id=42000C;"
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project          "sprop-parameter-sets=Z0IADJZUCg+I,aM44gA==\r\n"
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "a=mpeg4-esid:201\r\n"
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=cliprect:0,0,240,320\r\n"
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=framesize:97 320-240\r\n";
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#elif 0
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    // My H263 SDP
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    static const char *raw =
1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "v=0\r\n"
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "s=QuickTime\r\n"
1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "t=0 0\r\n"
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=range:npt=0-315\r\n"
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=isma-compliance:2,2.0,2\r\n"
1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "m=video 5434 RTP/AVP 97\r\n"
1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "c=IN IP4 127.0.0.1\r\n"
1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "b=AS:30\r\n"
1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=rtpmap:97 H263-1998/90000\r\n"
1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=cliprect:0,0,240,320\r\n"
1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=framesize:97 320-240\r\n";
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#elif 0
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    // My AMR SDP
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    static const char *raw =
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "v=0\r\n"
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "s=QuickTime\r\n"
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "t=0 0\r\n"
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=range:npt=0-315\r\n"
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=isma-compliance:2,2.0,2\r\n"
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "m=audio 5434 RTP/AVP 97\r\n"
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "c=IN IP4 127.0.0.1\r\n"
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "b=AS:30\r\n"
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=rtpmap:97 AMR/8000/1\r\n"
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=fmtp:97 octet-align\r\n";
1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#elif 1
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    // GTalk's H264 SDP
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    static const char *raw =
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "v=0\r\n"
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
132bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu        "s=QuickTime\r\n"
133bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu        "t=0 0\r\n"
134bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu        "a=range:npt=now-\r\n"
135bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu        "m=video 5434 RTP/AVP 96\r\n"
136bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu        "c=IN IP4 127.0.0.1\r\n"
137bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu        "b=AS:320000\r\n"
138bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu        "a=rtpmap:96 H264/90000\r\n"
1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=fmtp:96 packetization-mode=1;profile-level-id=42001E;"
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "sprop-parameter-sets=Z0IAHpZUBaHogA==,aM44gA==\r\n"
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=cliprect:0,0,480,270\r\n"
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=framesize:96 720-480\r\n";
1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#else
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    // sholes H264 SDP
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    static const char *raw =
1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "v=0\r\n"
1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "s=QuickTime\r\n"
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "t=0 0\r\n"
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=range:npt=now-\r\n"
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "m=video 5434 RTP/AVP 96\r\n"
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "c=IN IP4 127.0.0.1\r\n"
1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "b=AS:320000\r\n"
1546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=rtpmap:96 H264/90000\r\n"
1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=fmtp:96 packetization-mode=1;profile-level-id=42001E;"
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "sprop-parameter-sets=Z0KACukCg+QgAAB9AAAOpgCA,aM48gA==\r\n"
157bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu        "a=cliprect:0,0,240,320\r\n"
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "a=framesize:96 320-240\r\n";
159bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu#endif
160bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu
161bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu    sp<ASessionDescription> desc = new ASessionDescription;
162bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu    CHECK(desc->setTo(raw, strlen(raw)));
16345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
16445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    CHECK_EQ(session->setup(desc), (status_t)OK);
16545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
16645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    if (rtp_pusher != NULL) {
16745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        rtp_pusher->start();
16845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    }
16945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (rtcp_pusher != NULL) {
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rtcp_pusher->start();
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    looper->start(false /* runOnCallingThread */);
17545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
17645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    CHECK_EQ(session->countTracks(), 1u);
17745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    sp<MediaSource> source = session->trackAt(0);
17845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
17945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    sp<MediaSource> decoder = SimpleDecodingSource::Create(
18045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu            source, 0 /* flags: ACodec::kPreferSoftwareCodecs */);
18145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    CHECK(decoder != NULL);
18245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
18345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    CHECK_EQ(decoder->start(), (status_t)OK);
18445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
18545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    for (;;) {
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        MediaBuffer *buffer;
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        status_t err = decoder->read(&buffer);
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (err != OK) {
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (err == INFO_FORMAT_CHANGED) {
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                int32_t width, height;
19245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                CHECK(decoder->getFormat()->findInt32(kKeyWidth, &width));
19345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                CHECK(decoder->getFormat()->findInt32(kKeyHeight, &height));
19445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                printf("INFO_FORMAT_CHANGED %d x %d\n", width, height);
19545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                continue;
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE("decoder returned error 0x%08x", err);
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if 1
2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (buffer->range_length() != 0) {
2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            int64_t timeUs;
2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs));
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            printf("decoder returned frame of size %zu at time %.2f secs\n",
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                   buffer->range_length(), timeUs / 1E6);
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        buffer->release();
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        buffer = NULL;
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CHECK_EQ(decoder->stop(), (status_t)OK);
2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    looper->stop();
2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return 0;
2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi}
2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi