1a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang/* 2a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * Copyright (C) 2012 The Android Open Source Project 3a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * 4a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * Licensed under the Apache License, Version 2.0 (the "License"); 5a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * you may not use this file except in compliance with the License. 6a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * You may obtain a copy of the License at 7a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * 8a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * http://www.apache.org/licenses/LICENSE-2.0 9a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * 10a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * Unless required by applicable law or agreed to in writing, software 11a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * distributed under the License is distributed on an "AS IS" BASIS, 12a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * See the License for the specific language governing permissions and 14a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * limitations under the License. 15a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang */ 16a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 17a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#define LOG_TAG "TimedTextSRTSource_test" 18a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#include <utils/Log.h> 19a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 20a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#include <gtest/gtest.h> 21a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 22a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#include <binder/Parcel.h> 23a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#include <media/stagefright/foundation/AString.h> 24a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#include <media/stagefright/DataSource.h> 25a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#include <media/stagefright/MediaErrors.h> 26a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#include <utils/misc.h> 27a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 28a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#include <TimedTextSource.h> 29a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang#include <TimedTextSRTSource.h> 30a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 31a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangnamespace android { 32a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangnamespace test { 33a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 34a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangstatic const int kSecToUsec = 1000000; 35a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangstatic const int kSecToMsec = 1000; 36a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangstatic const int kMsecToUsec = 1000; 37a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 38a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang/* SRT format (http://en.wikipedia.org/wiki/SubRip) 39a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * Subtitle number 40a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * Start time --> End time 41a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * Text of subtitle (one or more lines) 42a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang * Blank lines 43a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang */ 44a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangstatic const char *kSRTString = 45a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang "1\n00:00:1,000 --> 00:00:1,500\n1\n\n" 46a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang "2\n00:00:2,000 --> 00:00:2,500\n2\n\n" 47a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang "3\n00:00:3,000 --> 00:00:3,500\n3\n\n" 48a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang "4\n00:00:4,000 --> 00:00:4,500\n4\n\n" 49a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang "5\n00:00:5,000 --> 00:00:5,500\n5\n\n" 50a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang // edge case : previos end time = next start time 51a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang "6\n00:00:5,500 --> 00:00:5,800\n6\n\n" 52a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang "7\n00:00:5,800 --> 00:00:6,000\n7\n\n" 53a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang "8\n00:00:6,000 --> 00:00:7,000\n8\n\n"; 54a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 55a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangclass SRTDataSourceStub : public DataSource { 56a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangpublic: 57a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang SRTDataSourceStub(const char *data, size_t size) : 58a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang mData(data), mSize(size) {} 59a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang virtual ~SRTDataSourceStub() {} 60a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 61a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang virtual status_t initCheck() const { 62a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang return OK; 63a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang } 64a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 65a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang virtual ssize_t readAt(off64_t offset, void *data, size_t size) { 66a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang if (offset >= mSize) return 0; 67a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 68a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang ssize_t avail = mSize - offset; 69a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang if (avail > size) { 70a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang avail = size; 71a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang } 72a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang memcpy(data, mData + offset, avail); 73a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang return avail; 74a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang } 75a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 76a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangprivate: 77a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang const char *mData; 78a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang size_t mSize; 79a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang}; 80a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 81a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangclass TimedTextSRTSourceTest : public testing::Test { 82a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kangprotected: 83a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang void SetUp() { 84a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang sp<DataSource> stub= new SRTDataSourceStub( 85a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang kSRTString, 86a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang strlen(kSRTString)); 87a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang mSource = new TimedTextSRTSource(stub); 88a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang mSource->start(); 89a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang } 90a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 91a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang void CheckStartTimeMs(const Parcel& parcel, int32_t timeMs) { 92a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang int32_t intval; 93a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang parcel.setDataPosition(8); 94a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang parcel.readInt32(&intval); 95a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(timeMs, intval); 96a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang } 97a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 98a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang void CheckDataEquals(const Parcel& parcel, const char* content) { 99a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang int32_t intval; 100a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang parcel.setDataPosition(16); 101a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang parcel.readInt32(&intval); 102a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang parcel.setDataPosition(24); 103a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang const char* data = (const char*) parcel.readInplace(intval); 104a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 105a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang int32_t content_len = strlen(content); 106a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(content_len, intval); 107a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_TRUE(strncmp(data, content, content_len) == 0); 108a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang } 109a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 110a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang sp<TimedTextSource> mSource; 111a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang int64_t startTimeUs; 112a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang int64_t endTimeUs; 113a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang Parcel parcel; 114a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang AString subtitle; 115a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang status_t err; 116a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang}; 117a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 118a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun KangTEST_F(TimedTextSRTSourceTest, readAll) { 119a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang for (int i = 1; i <= 5; i++) { 120a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel); 121a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 122a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckStartTimeMs(parcel, i * kSecToMsec); 123a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang subtitle = StringPrintf("%d\n\n", i); 124a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckDataEquals(parcel, subtitle.c_str()); 125a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang } 126a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang // read edge cases 127a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel); 128a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 129a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckStartTimeMs(parcel, 5500); 130a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang subtitle = StringPrintf("6\n\n"); 131a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckDataEquals(parcel, subtitle.c_str()); 132a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 133a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel); 134a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 135a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckStartTimeMs(parcel, 5800); 136a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang subtitle = StringPrintf("7\n\n"); 137a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckDataEquals(parcel, subtitle.c_str()); 138a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 139a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel); 140a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 141a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckStartTimeMs(parcel, 6000); 142a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang subtitle = StringPrintf("8\n\n"); 143a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckDataEquals(parcel, subtitle.c_str()); 144a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 145a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel); 146a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(ERROR_END_OF_STREAM, err); 147a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang} 148a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 149a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun KangTEST_F(TimedTextSRTSourceTest, seekTimeIsEarlierThanFirst) { 150a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang MediaSource::ReadOptions options; 151a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(500, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 152a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 153a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 154a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(1 * kSecToUsec, startTimeUs); 155a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckStartTimeMs(parcel, 1 * kSecToMsec); 156a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang} 157a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 158a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun KangTEST_F(TimedTextSRTSourceTest, seekTimeIsLaterThanLast) { 159a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang MediaSource::ReadOptions options; 160a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(7 * kSecToUsec, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 161a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 162a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(ERROR_END_OF_STREAM, err); 163a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 164a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(8 * kSecToUsec, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 165a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 166a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(ERROR_END_OF_STREAM, err); 167a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang} 168a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 169a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun KangTEST_F(TimedTextSRTSourceTest, seekTimeIsMatched) { 170a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang for (int i = 1; i <= 5; i++) { 171a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang MediaSource::ReadOptions options; 172a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(i * kSecToUsec, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 173a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 174a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 175a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(i * kSecToUsec, startTimeUs); 176a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 177a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(i * kSecToUsec + 100, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 178a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 179a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 180a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(i * kSecToUsec, startTimeUs); 181a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang } 182a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang} 183a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 184a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun KangTEST_F(TimedTextSRTSourceTest, seekTimeInBetweenTwo) { 185a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang for (int i = 1; i <= 4; i++) { 186a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang MediaSource::ReadOptions options; 187a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(i * kSecToUsec + 500000, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 188a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 189a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 190a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ((i + 1) * kSecToUsec, startTimeUs); 191a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 192a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(i * kSecToUsec + 600000, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 193a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 194a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 195a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ((i + 1) * kSecToUsec, startTimeUs); 196a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang } 197a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang} 198a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 199a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun KangTEST_F(TimedTextSRTSourceTest, checkEdgeCase) { 200a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang MediaSource::ReadOptions options; 201a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(5500 * kMsecToUsec, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 202a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 203a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 204a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(5500 * kMsecToUsec, startTimeUs); 205a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang subtitle = StringPrintf("6\n\n"); 206a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckDataEquals(parcel, subtitle.c_str()); 207a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 208a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(5800 * kMsecToUsec, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 209a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 210a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 211a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(5800 * kMsecToUsec, startTimeUs); 212a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang subtitle = StringPrintf("7\n\n"); 213a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckDataEquals(parcel, subtitle.c_str()); 214a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 215a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang options.setSeekTo(6000 * kMsecToUsec, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 216a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options); 217a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(OK, err); 218a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang EXPECT_EQ(6000 * kMsecToUsec, startTimeUs); 219a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang subtitle = StringPrintf("8\n\n"); 220a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang CheckDataEquals(parcel, subtitle.c_str()); 221a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang} 222a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang 223a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang} // namespace test 224a3c9d82d0f898d30982840b48d1f00fd0d831e19Insun Kang} // namespace android 225