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