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 2327b70ced96371d261d2c04b583c6d68d55637301Lajos Molnar#include <media/stagefright/foundation/base64.h> 2439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/ADebug.h> 2539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/ALooper.h> 2639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/DataSource.h> 2727b70ced96371d261d2c04b583c6d68d55637301Lajos Molnar#include <media/stagefright/MediaBuffer.h> 2839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/MetaData.h> 2927b70ced96371d261d2c04b583c6d68d55637301Lajos Molnar#include <media/stagefright/SimpleDecodingSource.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 18127b70ced96371d261d2c04b583c6d68d55637301Lajos Molnar sp<MediaSource> decoder = SimpleDecodingSource::Create( 18227b70ced96371d261d2c04b583c6d68d55637301Lajos Molnar source, 0 /* flags: ACodec::kPreferSoftwareCodecs */); 18339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(decoder != NULL); 18439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 18539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK_EQ(decoder->start(), (status_t)OK); 18639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 18739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber for (;;) { 18839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber MediaBuffer *buffer; 18939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber status_t err = decoder->read(&buffer); 19039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 19139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (err != OK) { 19239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (err == INFO_FORMAT_CHANGED) { 19339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber int32_t width, height; 19439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(decoder->getFormat()->findInt32(kKeyWidth, &width)); 19539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(decoder->getFormat()->findInt32(kKeyHeight, &height)); 19639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber printf("INFO_FORMAT_CHANGED %d x %d\n", width, height); 19739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber continue; 19839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 19939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 20029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("decoder returned error 0x%08x", err); 20139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber break; 20239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 20339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 20439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 1 20539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (buffer->range_length() != 0) { 20639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber int64_t timeUs; 20739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs)); 20839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 20927b70ced96371d261d2c04b583c6d68d55637301Lajos Molnar printf("decoder returned frame of size %zu at time %.2f secs\n", 21039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber buffer->range_length(), timeUs / 1E6); 21139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 21239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif 21339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 21439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber buffer->release(); 21539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber buffer = NULL; 21639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 21739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 21839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK_EQ(decoder->stop(), (status_t)OK); 21939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 22039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber looper->stop(); 22139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 22239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return 0; 22339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 224