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