blob: 156991eb13b932656f02f04f054fe88b61f46764 [file] [log] [blame]
Wei Jia53692fa2017-12-11 10:33:46 -08001/*
2 * Copyright 2017, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "NdkWrapper"
19
Wei Jia28288fb2017-12-15 13:45:29 -080020#include <media/NdkWrapper.h>
Wei Jia53692fa2017-12-11 10:33:46 -080021
Wei Jia28288fb2017-12-15 13:45:29 -080022#include <android/native_window.h>
Wei Jia53692fa2017-12-11 10:33:46 -080023#include <log/log.h>
24#include <media/NdkMediaCodec.h>
25#include <media/NdkMediaCrypto.h>
26#include <media/NdkMediaDrm.h>
27#include <media/NdkMediaFormat.h>
Robert Shihff282cb2017-12-18 14:10:56 -080028#include <media/NdkMediaExtractor.h>
Wei Jia53692fa2017-12-11 10:33:46 -080029#include <media/stagefright/MetaData.h>
30#include <media/stagefright/foundation/ABuffer.h>
31#include <media/stagefright/foundation/AMessage.h>
32#include <utils/Errors.h>
33
Robert Shih4d432f12018-11-01 12:29:06 -070034#include "NdkMediaDataSourceCallbacksPriv.h"
35
Wei Jia53692fa2017-12-11 10:33:46 -080036namespace android {
37
38static const size_t kAESBlockSize = 16; // AES_BLOCK_SIZE
39
40static const char *AMediaFormatKeyGroupInt32[] = {
41 AMEDIAFORMAT_KEY_AAC_DRC_ATTENUATION_FACTOR,
42 AMEDIAFORMAT_KEY_AAC_DRC_BOOST_FACTOR,
43 AMEDIAFORMAT_KEY_AAC_DRC_HEAVY_COMPRESSION,
44 AMEDIAFORMAT_KEY_AAC_DRC_TARGET_REFERENCE_LEVEL,
45 AMEDIAFORMAT_KEY_AAC_ENCODED_TARGET_LEVEL,
46 AMEDIAFORMAT_KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT,
47 AMEDIAFORMAT_KEY_AAC_PROFILE,
48 AMEDIAFORMAT_KEY_AAC_SBR_MODE,
49 AMEDIAFORMAT_KEY_AUDIO_SESSION_ID,
50 AMEDIAFORMAT_KEY_BITRATE_MODE,
51 AMEDIAFORMAT_KEY_BIT_RATE,
52 AMEDIAFORMAT_KEY_CAPTURE_RATE,
53 AMEDIAFORMAT_KEY_CHANNEL_COUNT,
54 AMEDIAFORMAT_KEY_CHANNEL_MASK,
55 AMEDIAFORMAT_KEY_COLOR_FORMAT,
56 AMEDIAFORMAT_KEY_COLOR_RANGE,
57 AMEDIAFORMAT_KEY_COLOR_STANDARD,
58 AMEDIAFORMAT_KEY_COLOR_TRANSFER,
59 AMEDIAFORMAT_KEY_COMPLEXITY,
Robert Shih4a84cbb2018-12-18 16:34:47 -080060 AMEDIAFORMAT_KEY_CRYPTO_DEFAULT_IV_SIZE,
61 AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_BYTE_BLOCK,
62 AMEDIAFORMAT_KEY_CRYPTO_MODE,
63 AMEDIAFORMAT_KEY_CRYPTO_SKIP_BYTE_BLOCK,
Wei Jia53692fa2017-12-11 10:33:46 -080064 AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL,
Chong Zhang67d5b912018-03-14 18:17:40 -070065 AMEDIAFORMAT_KEY_GRID_COLUMNS,
Wei Jia53692fa2017-12-11 10:33:46 -080066 AMEDIAFORMAT_KEY_GRID_ROWS,
Wei Jia53692fa2017-12-11 10:33:46 -080067 AMEDIAFORMAT_KEY_HEIGHT,
68 AMEDIAFORMAT_KEY_INTRA_REFRESH_PERIOD,
69 AMEDIAFORMAT_KEY_IS_ADTS,
70 AMEDIAFORMAT_KEY_IS_AUTOSELECT,
71 AMEDIAFORMAT_KEY_IS_DEFAULT,
72 AMEDIAFORMAT_KEY_IS_FORCED_SUBTITLE,
73 AMEDIAFORMAT_KEY_LATENCY,
74 AMEDIAFORMAT_KEY_LEVEL,
75 AMEDIAFORMAT_KEY_MAX_HEIGHT,
76 AMEDIAFORMAT_KEY_MAX_INPUT_SIZE,
77 AMEDIAFORMAT_KEY_MAX_WIDTH,
78 AMEDIAFORMAT_KEY_PCM_ENCODING,
79 AMEDIAFORMAT_KEY_PRIORITY,
80 AMEDIAFORMAT_KEY_PROFILE,
81 AMEDIAFORMAT_KEY_PUSH_BLANK_BUFFERS_ON_STOP,
82 AMEDIAFORMAT_KEY_ROTATION,
83 AMEDIAFORMAT_KEY_SAMPLE_RATE,
84 AMEDIAFORMAT_KEY_SLICE_HEIGHT,
85 AMEDIAFORMAT_KEY_STRIDE,
86 AMEDIAFORMAT_KEY_TRACK_ID,
87 AMEDIAFORMAT_KEY_WIDTH,
Robert Shih0cd95062018-01-21 17:41:16 -080088 AMEDIAFORMAT_KEY_DISPLAY_HEIGHT,
89 AMEDIAFORMAT_KEY_DISPLAY_WIDTH,
90 AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID,
Chong Zhang67d5b912018-03-14 18:17:40 -070091 AMEDIAFORMAT_KEY_TILE_HEIGHT,
92 AMEDIAFORMAT_KEY_TILE_WIDTH,
Robert Shih0cd95062018-01-21 17:41:16 -080093 AMEDIAFORMAT_KEY_TRACK_INDEX,
Wei Jia53692fa2017-12-11 10:33:46 -080094};
95
96static const char *AMediaFormatKeyGroupInt64[] = {
97 AMEDIAFORMAT_KEY_DURATION,
98 AMEDIAFORMAT_KEY_REPEAT_PREVIOUS_FRAME_AFTER,
Robert Shih0cd95062018-01-21 17:41:16 -080099 AMEDIAFORMAT_KEY_TIME_US,
Wei Jia53692fa2017-12-11 10:33:46 -0800100};
101
102static const char *AMediaFormatKeyGroupString[] = {
103 AMEDIAFORMAT_KEY_LANGUAGE,
104 AMEDIAFORMAT_KEY_MIME,
105 AMEDIAFORMAT_KEY_TEMPORAL_LAYERING,
106};
107
108static const char *AMediaFormatKeyGroupBuffer[] = {
Robert Shih4a84cbb2018-12-18 16:34:47 -0800109 AMEDIAFORMAT_KEY_CRYPTO_IV,
110 AMEDIAFORMAT_KEY_CRYPTO_KEY,
Wei Jia53692fa2017-12-11 10:33:46 -0800111 AMEDIAFORMAT_KEY_HDR_STATIC_INFO,
Robert Shih0cd95062018-01-21 17:41:16 -0800112 AMEDIAFORMAT_KEY_SEI,
113 AMEDIAFORMAT_KEY_MPEG_USER_DATA,
114};
115
116static const char *AMediaFormatKeyGroupCsd[] = {
117 AMEDIAFORMAT_KEY_CSD_0,
118 AMEDIAFORMAT_KEY_CSD_1,
119 AMEDIAFORMAT_KEY_CSD_2,
Wei Jia53692fa2017-12-11 10:33:46 -0800120};
121
122static const char *AMediaFormatKeyGroupRect[] = {
123 AMEDIAFORMAT_KEY_DISPLAY_CROP,
124};
125
126static const char *AMediaFormatKeyGroupFloatInt32[] = {
127 AMEDIAFORMAT_KEY_FRAME_RATE,
128 AMEDIAFORMAT_KEY_I_FRAME_INTERVAL,
129 AMEDIAFORMAT_KEY_OPERATING_RATE,
130};
131
132static status_t translateErrorCode(media_status_t err) {
133 if (err == AMEDIA_OK) {
134 return OK;
Robert Shihd83d4f42018-02-24 19:02:46 -0800135 } else if (err == AMEDIA_ERROR_END_OF_STREAM) {
136 return ERROR_END_OF_STREAM;
137 } else if (err == AMEDIA_ERROR_IO) {
138 return ERROR_IO;
Wei Jia53692fa2017-12-11 10:33:46 -0800139 } else if (err == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
140 return -EAGAIN;
141 }
142
143 ALOGE("ndk error code: %d", err);
144 return UNKNOWN_ERROR;
145}
146
147static int32_t translateActionCode(int32_t actionCode) {
148 if (AMediaCodecActionCode_isTransient(actionCode)) {
149 return ACTION_CODE_TRANSIENT;
150 } else if (AMediaCodecActionCode_isRecoverable(actionCode)) {
151 return ACTION_CODE_RECOVERABLE;
152 }
153 return ACTION_CODE_FATAL;
154}
155
156static CryptoPlugin::Mode translateToCryptoPluginMode(cryptoinfo_mode_t mode) {
157 CryptoPlugin::Mode ret = CryptoPlugin::kMode_Unencrypted;
158 switch (mode) {
159 case AMEDIACODECRYPTOINFO_MODE_AES_CTR: {
160 ret = CryptoPlugin::kMode_AES_CTR;
161 break;
162 }
163
164 case AMEDIACODECRYPTOINFO_MODE_AES_WV: {
165 ret = CryptoPlugin::kMode_AES_WV;
166 break;
167 }
168
169 case AMEDIACODECRYPTOINFO_MODE_AES_CBC: {
170 ret = CryptoPlugin::kMode_AES_CBC;
171 break;
172 }
173
174 default:
175 break;
176 }
177
178 return ret;
179}
180
181static cryptoinfo_mode_t translateToCryptoInfoMode(CryptoPlugin::Mode mode) {
182 cryptoinfo_mode_t ret = AMEDIACODECRYPTOINFO_MODE_CLEAR;
183 switch (mode) {
184 case CryptoPlugin::kMode_AES_CTR: {
185 ret = AMEDIACODECRYPTOINFO_MODE_AES_CTR;
186 break;
187 }
188
189 case CryptoPlugin::kMode_AES_WV: {
190 ret = AMEDIACODECRYPTOINFO_MODE_AES_WV;
191 break;
192 }
193
194 case CryptoPlugin::kMode_AES_CBC: {
195 ret = AMEDIACODECRYPTOINFO_MODE_AES_CBC;
196 break;
197 }
198
199 default:
200 break;
201 }
202
203 return ret;
204}
205
Wei Jia53692fa2017-12-11 10:33:46 -0800206//////////// AMediaFormatWrapper
207// static
208sp<AMediaFormatWrapper> AMediaFormatWrapper::Create(const sp<AMessage> &message) {
209 sp<AMediaFormatWrapper> aMediaFormat = new AMediaFormatWrapper();
210
211 for (size_t i = 0; i < message->countEntries(); ++i) {
212 AMessage::Type valueType;
213 const char *key = message->getEntryNameAt(i, &valueType);
214
215 switch (valueType) {
216 case AMessage::kTypeInt32: {
217 int32_t val;
218 if (!message->findInt32(key, &val)) {
219 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
220 continue;
221 }
222 aMediaFormat->setInt32(key, val);
223 break;
224 }
225
226 case AMessage::kTypeInt64: {
227 int64_t val;
228 if (!message->findInt64(key, &val)) {
229 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
230 continue;
231 }
232 aMediaFormat->setInt64(key, val);
233 break;
234 }
235
236 case AMessage::kTypeFloat: {
237 float val;
238 if (!message->findFloat(key, &val)) {
239 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
240 continue;
241 }
242 aMediaFormat->setFloat(key, val);
243 break;
244 }
245
246 case AMessage::kTypeDouble: {
247 double val;
248 if (!message->findDouble(key, &val)) {
249 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
250 continue;
251 }
252 aMediaFormat->setDouble(key, val);
253 break;
254 }
255
256 case AMessage::kTypeSize: {
257 size_t val;
258 if (!message->findSize(key, &val)) {
259 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
260 continue;
261 }
262 aMediaFormat->setSize(key, val);
263 break;
264 }
265
266 case AMessage::kTypeRect: {
267 int32_t left, top, right, bottom;
268 if (!message->findRect(key, &left, &top, &right, &bottom)) {
269 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
270 continue;
271 }
272 aMediaFormat->setRect(key, left, top, right, bottom);
273 break;
274 }
275
276 case AMessage::kTypeString: {
277 AString val;
278 if (!message->findString(key, &val)) {
279 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
280 continue;
281 }
282 aMediaFormat->setString(key, val);
283 break;
284 }
285
286 case AMessage::kTypeBuffer: {
287 sp<ABuffer> val;
288 if (!message->findBuffer(key, &val)) {
289 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
290 continue;
291 }
292 aMediaFormat->setBuffer(key, val->data(), val->size());
293 break;
294 }
295
296 default: {
297 break;
298 }
299 }
300 }
301
302 return aMediaFormat;
303}
304
305AMediaFormatWrapper::AMediaFormatWrapper() {
306 mAMediaFormat = AMediaFormat_new();
307}
308
309AMediaFormatWrapper::AMediaFormatWrapper(AMediaFormat *aMediaFormat)
310 : mAMediaFormat(aMediaFormat) {
311}
312
313AMediaFormatWrapper::~AMediaFormatWrapper() {
314 release();
315}
316
317status_t AMediaFormatWrapper::release() {
318 if (mAMediaFormat != NULL) {
319 media_status_t err = AMediaFormat_delete(mAMediaFormat);
320 mAMediaFormat = NULL;
321 return translateErrorCode(err);
322 }
323 return OK;
324}
325
326AMediaFormat *AMediaFormatWrapper::getAMediaFormat() const {
327 return mAMediaFormat;
328}
329
330sp<AMessage> AMediaFormatWrapper::toAMessage() const {
Robert Shih0cd95062018-01-21 17:41:16 -0800331 sp<AMessage> msg;
332 writeToAMessage(msg);
333 return msg;
334}
335
336void AMediaFormatWrapper::writeToAMessage(sp<AMessage> &msg) const {
Wei Jia53692fa2017-12-11 10:33:46 -0800337 if (mAMediaFormat == NULL) {
Robert Shih0cd95062018-01-21 17:41:16 -0800338 msg = NULL;
Wei Jia53692fa2017-12-11 10:33:46 -0800339 }
340
Robert Shih0cd95062018-01-21 17:41:16 -0800341 if (msg == NULL) {
342 msg = new AMessage;
343 }
Wei Jia53692fa2017-12-11 10:33:46 -0800344 for (auto& key : AMediaFormatKeyGroupInt32) {
345 int32_t val;
346 if (getInt32(key, &val)) {
347 msg->setInt32(key, val);
348 }
349 }
350 for (auto& key : AMediaFormatKeyGroupInt64) {
351 int64_t val;
352 if (getInt64(key, &val)) {
353 msg->setInt64(key, val);
354 }
355 }
356 for (auto& key : AMediaFormatKeyGroupString) {
357 AString val;
358 if (getString(key, &val)) {
359 msg->setString(key, val);
360 }
361 }
362 for (auto& key : AMediaFormatKeyGroupBuffer) {
363 void *data;
364 size_t size;
365 if (getBuffer(key, &data, &size)) {
366 sp<ABuffer> buffer = ABuffer::CreateAsCopy(data, size);
367 msg->setBuffer(key, buffer);
368 }
369 }
Robert Shih0cd95062018-01-21 17:41:16 -0800370 for (auto& key : AMediaFormatKeyGroupCsd) {
371 void *data;
372 size_t size;
373 if (getBuffer(key, &data, &size)) {
374 sp<ABuffer> buffer = ABuffer::CreateAsCopy(data, size);
375 buffer->meta()->setInt32(AMEDIAFORMAT_KEY_CSD, 1);
376 buffer->meta()->setInt64(AMEDIAFORMAT_KEY_TIME_US, 0);
377 msg->setBuffer(key, buffer);
378 }
379 }
Wei Jia53692fa2017-12-11 10:33:46 -0800380 for (auto& key : AMediaFormatKeyGroupRect) {
381 int32_t left, top, right, bottom;
382 if (getRect(key, &left, &top, &right, &bottom)) {
383 msg->setRect(key, left, top, right, bottom);
384 }
385 }
386 for (auto& key : AMediaFormatKeyGroupFloatInt32) {
387 float valFloat;
388 if (getFloat(key, &valFloat)) {
389 msg->setFloat(key, valFloat);
390 } else {
391 int32_t valInt32;
392 if (getInt32(key, &valInt32)) {
393 msg->setFloat(key, (float)valInt32);
394 }
395 }
396 }
Wei Jia53692fa2017-12-11 10:33:46 -0800397}
398
399const char* AMediaFormatWrapper::toString() const {
400 if (mAMediaFormat == NULL) {
401 return NULL;
402 }
403 return AMediaFormat_toString(mAMediaFormat);
404}
405
406bool AMediaFormatWrapper::getInt32(const char *name, int32_t *out) const {
407 if (mAMediaFormat == NULL) {
408 return false;
409 }
410 return AMediaFormat_getInt32(mAMediaFormat, name, out);
411}
412
413bool AMediaFormatWrapper::getInt64(const char *name, int64_t *out) const {
414 if (mAMediaFormat == NULL) {
415 return false;
416 }
417 return AMediaFormat_getInt64(mAMediaFormat, name, out);
418}
419
420bool AMediaFormatWrapper::getFloat(const char *name, float *out) const {
421 if (mAMediaFormat == NULL) {
422 return false;
423 }
424 return AMediaFormat_getFloat(mAMediaFormat, name, out);
425}
426
427bool AMediaFormatWrapper::getDouble(const char *name, double *out) const {
428 if (mAMediaFormat == NULL) {
429 return false;
430 }
431 return AMediaFormat_getDouble(mAMediaFormat, name, out);
432}
433
434bool AMediaFormatWrapper::getSize(const char *name, size_t *out) const {
435 if (mAMediaFormat == NULL) {
436 return false;
437 }
438 return AMediaFormat_getSize(mAMediaFormat, name, out);
439}
440
441bool AMediaFormatWrapper::getRect(
442 const char *name, int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const {
443 if (mAMediaFormat == NULL) {
444 return false;
445 }
446 return AMediaFormat_getRect(mAMediaFormat, name, left, top, right, bottom);
447}
448
449bool AMediaFormatWrapper::getBuffer(const char *name, void** data, size_t *outSize) const {
450 if (mAMediaFormat == NULL) {
451 return false;
452 }
453 return AMediaFormat_getBuffer(mAMediaFormat, name, data, outSize);
454}
455
456bool AMediaFormatWrapper::getString(const char *name, AString *out) const {
457 if (mAMediaFormat == NULL) {
458 return false;
459 }
460 const char *outChar = NULL;
461 bool ret = AMediaFormat_getString(mAMediaFormat, name, &outChar);
462 if (ret) {
463 *out = AString(outChar);
464 }
465 return ret;
466}
467
468void AMediaFormatWrapper::setInt32(const char* name, int32_t value) {
469 if (mAMediaFormat != NULL) {
470 AMediaFormat_setInt32(mAMediaFormat, name, value);
471 }
472}
473
474void AMediaFormatWrapper::setInt64(const char* name, int64_t value) {
475 if (mAMediaFormat != NULL) {
476 AMediaFormat_setInt64(mAMediaFormat, name, value);
477 }
478}
479
480void AMediaFormatWrapper::setFloat(const char* name, float value) {
481 if (mAMediaFormat != NULL) {
482 AMediaFormat_setFloat(mAMediaFormat, name, value);
483 }
484}
485
486void AMediaFormatWrapper::setDouble(const char* name, double value) {
487 if (mAMediaFormat != NULL) {
488 AMediaFormat_setDouble(mAMediaFormat, name, value);
489 }
490}
491
492void AMediaFormatWrapper::setSize(const char* name, size_t value) {
493 if (mAMediaFormat != NULL) {
494 AMediaFormat_setSize(mAMediaFormat, name, value);
495 }
496}
497
498void AMediaFormatWrapper::setRect(
499 const char* name, int32_t left, int32_t top, int32_t right, int32_t bottom) {
500 if (mAMediaFormat != NULL) {
501 AMediaFormat_setRect(mAMediaFormat, name, left, top, right, bottom);
502 }
503}
504
505void AMediaFormatWrapper::setString(const char* name, const AString &value) {
506 if (mAMediaFormat != NULL) {
507 AMediaFormat_setString(mAMediaFormat, name, value.c_str());
508 }
509}
510
511void AMediaFormatWrapper::setBuffer(const char* name, void* data, size_t size) {
512 if (mAMediaFormat != NULL) {
513 AMediaFormat_setBuffer(mAMediaFormat, name, data, size);
514 }
515}
516
517
Wei Jia28288fb2017-12-15 13:45:29 -0800518//////////// ANativeWindowWrapper
519ANativeWindowWrapper::ANativeWindowWrapper(ANativeWindow *aNativeWindow)
520 : mANativeWindow(aNativeWindow) {
521 if (aNativeWindow != NULL) {
522 ANativeWindow_acquire(aNativeWindow);
523 }
524}
525
526ANativeWindowWrapper::~ANativeWindowWrapper() {
527 release();
528}
529
530status_t ANativeWindowWrapper::release() {
531 if (mANativeWindow != NULL) {
532 ANativeWindow_release(mANativeWindow);
533 mANativeWindow = NULL;
534 }
535 return OK;
536}
537
538ANativeWindow *ANativeWindowWrapper::getANativeWindow() const {
539 return mANativeWindow;
540}
541
542
Wei Jia53692fa2017-12-11 10:33:46 -0800543//////////// AMediaDrmWrapper
544AMediaDrmWrapper::AMediaDrmWrapper(const uint8_t uuid[16]) {
545 mAMediaDrm = AMediaDrm_createByUUID(uuid);
546}
547
548AMediaDrmWrapper::AMediaDrmWrapper(AMediaDrm *aMediaDrm)
549 : mAMediaDrm(aMediaDrm) {
550}
551
552AMediaDrmWrapper::~AMediaDrmWrapper() {
553 release();
554}
555
556status_t AMediaDrmWrapper::release() {
557 if (mAMediaDrm != NULL) {
558 AMediaDrm_release(mAMediaDrm);
559 mAMediaDrm = NULL;
560 }
561 return OK;
562}
563
564AMediaDrm *AMediaDrmWrapper::getAMediaDrm() const {
565 return mAMediaDrm;
566}
567
568// static
569bool AMediaDrmWrapper::isCryptoSchemeSupported(
570 const uint8_t uuid[16],
571 const char *mimeType) {
572 return AMediaDrm_isCryptoSchemeSupported(uuid, mimeType);
573}
574
575
576//////////// AMediaCryptoWrapper
577AMediaCryptoWrapper::AMediaCryptoWrapper(
578 const uint8_t uuid[16], const void *initData, size_t initDataSize) {
579 mAMediaCrypto = AMediaCrypto_new(uuid, initData, initDataSize);
580}
581
582AMediaCryptoWrapper::AMediaCryptoWrapper(AMediaCrypto *aMediaCrypto)
583 : mAMediaCrypto(aMediaCrypto) {
584}
585
586AMediaCryptoWrapper::~AMediaCryptoWrapper() {
587 release();
588}
589
590status_t AMediaCryptoWrapper::release() {
591 if (mAMediaCrypto != NULL) {
592 AMediaCrypto_delete(mAMediaCrypto);
593 mAMediaCrypto = NULL;
594 }
595 return OK;
596}
597
598AMediaCrypto *AMediaCryptoWrapper::getAMediaCrypto() const {
599 return mAMediaCrypto;
600}
601
602bool AMediaCryptoWrapper::isCryptoSchemeSupported(const uint8_t uuid[16]) {
603 if (mAMediaCrypto == NULL) {
604 return false;
605 }
606 return AMediaCrypto_isCryptoSchemeSupported(uuid);
607}
608
609bool AMediaCryptoWrapper::requiresSecureDecoderComponent(const char *mime) {
610 if (mAMediaCrypto == NULL) {
611 return false;
612 }
613 return AMediaCrypto_requiresSecureDecoderComponent(mime);
614}
615
616
617//////////// AMediaCodecCryptoInfoWrapper
618// static
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800619sp<AMediaCodecCryptoInfoWrapper> AMediaCodecCryptoInfoWrapper::Create(MetaDataBase &meta) {
Wei Jia53692fa2017-12-11 10:33:46 -0800620
621 uint32_t type;
622 const void *crypteddata;
623 size_t cryptedsize;
624
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800625 if (!meta.findData(kKeyEncryptedSizes, &type, &crypteddata, &cryptedsize)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800626 return NULL;
627 }
628
629 int numSubSamples = cryptedsize / sizeof(size_t);
630
631 if (numSubSamples <= 0) {
632 ALOGE("Create: INVALID numSubSamples: %d", numSubSamples);
633 return NULL;
634 }
635
636 const void *cleardata;
637 size_t clearsize;
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800638 if (meta.findData(kKeyPlainSizes, &type, &cleardata, &clearsize)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800639 if (clearsize != cryptedsize) {
640 // The two must be of the same length.
641 ALOGE("Create: mismatch cryptedsize: %zu != clearsize: %zu", cryptedsize, clearsize);
642 return NULL;
643 }
644 }
645
646 const void *key;
647 size_t keysize;
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800648 if (meta.findData(kKeyCryptoKey, &type, &key, &keysize)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800649 if (keysize != kAESBlockSize) {
650 // Keys must be 16 bytes in length.
651 ALOGE("Create: Keys must be %zu bytes in length: %zu", kAESBlockSize, keysize);
652 return NULL;
653 }
654 }
655
656 const void *iv;
657 size_t ivsize;
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800658 if (meta.findData(kKeyCryptoIV, &type, &iv, &ivsize)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800659 if (ivsize != kAESBlockSize) {
660 // IVs must be 16 bytes in length.
661 ALOGE("Create: IV must be %zu bytes in length: %zu", kAESBlockSize, ivsize);
662 return NULL;
663 }
664 }
665
666 int32_t mode;
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800667 if (!meta.findInt32(kKeyCryptoMode, &mode)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800668 mode = CryptoPlugin::kMode_AES_CTR;
669 }
670
671 return new AMediaCodecCryptoInfoWrapper(
672 numSubSamples,
673 (uint8_t*) key,
674 (uint8_t*) iv,
675 (CryptoPlugin::Mode)mode,
676 (size_t*) cleardata,
677 (size_t*) crypteddata);
678}
679
680AMediaCodecCryptoInfoWrapper::AMediaCodecCryptoInfoWrapper(
681 int numsubsamples,
682 uint8_t key[16],
683 uint8_t iv[16],
684 CryptoPlugin::Mode mode,
685 size_t *clearbytes,
686 size_t *encryptedbytes) {
687 mAMediaCodecCryptoInfo =
688 AMediaCodecCryptoInfo_new(numsubsamples,
689 key,
690 iv,
691 translateToCryptoInfoMode(mode),
692 clearbytes,
693 encryptedbytes);
694}
695
696AMediaCodecCryptoInfoWrapper::AMediaCodecCryptoInfoWrapper(
697 AMediaCodecCryptoInfo *aMediaCodecCryptoInfo)
698 : mAMediaCodecCryptoInfo(aMediaCodecCryptoInfo) {
699}
700
701AMediaCodecCryptoInfoWrapper::~AMediaCodecCryptoInfoWrapper() {
702 release();
703}
704
705status_t AMediaCodecCryptoInfoWrapper::release() {
706 if (mAMediaCodecCryptoInfo != NULL) {
707 media_status_t err = AMediaCodecCryptoInfo_delete(mAMediaCodecCryptoInfo);
708 mAMediaCodecCryptoInfo = NULL;
709 return translateErrorCode(err);
710 }
711 return OK;
712}
713
714AMediaCodecCryptoInfo *AMediaCodecCryptoInfoWrapper::getAMediaCodecCryptoInfo() const {
715 return mAMediaCodecCryptoInfo;
716}
717
718void AMediaCodecCryptoInfoWrapper::setPattern(CryptoPlugin::Pattern *pattern) {
719 if (mAMediaCodecCryptoInfo == NULL || pattern == NULL) {
720 return;
721 }
722 cryptoinfo_pattern_t ndkPattern = {(int32_t)pattern->mEncryptBlocks,
723 (int32_t)pattern->mSkipBlocks };
724 return AMediaCodecCryptoInfo_setPattern(mAMediaCodecCryptoInfo, &ndkPattern);
725}
726
727size_t AMediaCodecCryptoInfoWrapper::getNumSubSamples() {
728 if (mAMediaCodecCryptoInfo == NULL) {
729 return 0;
730 }
731 return AMediaCodecCryptoInfo_getNumSubSamples(mAMediaCodecCryptoInfo);
732}
733
734status_t AMediaCodecCryptoInfoWrapper::getKey(uint8_t *dst) {
735 if (mAMediaCodecCryptoInfo == NULL) {
736 return DEAD_OBJECT;
737 }
738 if (dst == NULL) {
739 return BAD_VALUE;
740 }
741 return translateErrorCode(
742 AMediaCodecCryptoInfo_getKey(mAMediaCodecCryptoInfo, dst));
743}
744
745status_t AMediaCodecCryptoInfoWrapper::getIV(uint8_t *dst) {
746 if (mAMediaCodecCryptoInfo == NULL) {
747 return DEAD_OBJECT;
748 }
749 if (dst == NULL) {
750 return BAD_VALUE;
751 }
752 return translateErrorCode(
753 AMediaCodecCryptoInfo_getIV(mAMediaCodecCryptoInfo, dst));
754}
755
756CryptoPlugin::Mode AMediaCodecCryptoInfoWrapper::getMode() {
757 if (mAMediaCodecCryptoInfo == NULL) {
758 return CryptoPlugin::kMode_Unencrypted;
759 }
760 return translateToCryptoPluginMode(
761 AMediaCodecCryptoInfo_getMode(mAMediaCodecCryptoInfo));
762}
763
764status_t AMediaCodecCryptoInfoWrapper::getClearBytes(size_t *dst) {
765 if (mAMediaCodecCryptoInfo == NULL) {
766 return DEAD_OBJECT;
767 }
768 if (dst == NULL) {
769 return BAD_VALUE;
770 }
771 return translateErrorCode(
772 AMediaCodecCryptoInfo_getClearBytes(mAMediaCodecCryptoInfo, dst));
773}
774
775status_t AMediaCodecCryptoInfoWrapper::getEncryptedBytes(size_t *dst) {
776 if (mAMediaCodecCryptoInfo == NULL) {
777 return DEAD_OBJECT;
778 }
779 if (dst == NULL) {
780 return BAD_VALUE;
781 }
782 return translateErrorCode(
783 AMediaCodecCryptoInfo_getEncryptedBytes(mAMediaCodecCryptoInfo, dst));
784}
785
786
787//////////// AMediaCodecWrapper
788// static
789sp<AMediaCodecWrapper> AMediaCodecWrapper::CreateCodecByName(const AString &name) {
790 AMediaCodec *aMediaCodec = AMediaCodec_createCodecByName(name.c_str());
791 return new AMediaCodecWrapper(aMediaCodec);
792}
793
794// static
795sp<AMediaCodecWrapper> AMediaCodecWrapper::CreateDecoderByType(const AString &mimeType) {
796 AMediaCodec *aMediaCodec = AMediaCodec_createDecoderByType(mimeType.c_str());
797 return new AMediaCodecWrapper(aMediaCodec);
798}
799
800// static
801void AMediaCodecWrapper::OnInputAvailableCB(
802 AMediaCodec * /* aMediaCodec */,
803 void *userdata,
804 int32_t index) {
805 ALOGV("OnInputAvailableCB: index(%d)", index);
806 sp<AMessage> msg = sp<AMessage>((AMessage *)userdata)->dup();
807 msg->setInt32("callbackID", CB_INPUT_AVAILABLE);
808 msg->setInt32("index", index);
809 msg->post();
810}
811
812// static
813void AMediaCodecWrapper::OnOutputAvailableCB(
814 AMediaCodec * /* aMediaCodec */,
815 void *userdata,
816 int32_t index,
817 AMediaCodecBufferInfo *bufferInfo) {
818 ALOGV("OnOutputAvailableCB: index(%d), (%d, %d, %lld, 0x%x)",
819 index, bufferInfo->offset, bufferInfo->size,
820 (long long)bufferInfo->presentationTimeUs, bufferInfo->flags);
821 sp<AMessage> msg = sp<AMessage>((AMessage *)userdata)->dup();
822 msg->setInt32("callbackID", CB_OUTPUT_AVAILABLE);
823 msg->setInt32("index", index);
824 msg->setSize("offset", (size_t)(bufferInfo->offset));
825 msg->setSize("size", (size_t)(bufferInfo->size));
826 msg->setInt64("timeUs", bufferInfo->presentationTimeUs);
827 msg->setInt32("flags", (int32_t)(bufferInfo->flags));
828 msg->post();
829}
830
831// static
832void AMediaCodecWrapper::OnFormatChangedCB(
833 AMediaCodec * /* aMediaCodec */,
834 void *userdata,
835 AMediaFormat *format) {
836 sp<AMediaFormatWrapper> formatWrapper = new AMediaFormatWrapper(format);
837 sp<AMessage> outputFormat = formatWrapper->toAMessage();
838 ALOGV("OnFormatChangedCB: format(%s)", outputFormat->debugString().c_str());
839
840 sp<AMessage> msg = sp<AMessage>((AMessage *)userdata)->dup();
841 msg->setInt32("callbackID", CB_OUTPUT_FORMAT_CHANGED);
842 msg->setMessage("format", outputFormat);
843 msg->post();
844}
845
846// static
847void AMediaCodecWrapper::OnErrorCB(
848 AMediaCodec * /* aMediaCodec */,
849 void *userdata,
850 media_status_t err,
851 int32_t actionCode,
852 const char *detail) {
853 ALOGV("OnErrorCB: err(%d), actionCode(%d), detail(%s)", err, actionCode, detail);
854 sp<AMessage> msg = sp<AMessage>((AMessage *)userdata)->dup();
855 msg->setInt32("callbackID", CB_ERROR);
856 msg->setInt32("err", translateErrorCode(err));
857 msg->setInt32("actionCode", translateActionCode(actionCode));
858 msg->setString("detail", detail);
859 msg->post();
860}
861
862AMediaCodecWrapper::AMediaCodecWrapper(AMediaCodec *aMediaCodec)
863 : mAMediaCodec(aMediaCodec) {
864}
865
866AMediaCodecWrapper::~AMediaCodecWrapper() {
867 release();
868}
869
870status_t AMediaCodecWrapper::release() {
871 if (mAMediaCodec != NULL) {
872 AMediaCodecOnAsyncNotifyCallback aCB = {};
873 AMediaCodec_setAsyncNotifyCallback(mAMediaCodec, aCB, NULL);
874 mCallback = NULL;
875
876 media_status_t err = AMediaCodec_delete(mAMediaCodec);
877 mAMediaCodec = NULL;
878 return translateErrorCode(err);
879 }
880 return OK;
881}
882
883AMediaCodec *AMediaCodecWrapper::getAMediaCodec() const {
884 return mAMediaCodec;
885}
886
887status_t AMediaCodecWrapper::getName(AString *outComponentName) const {
888 if (mAMediaCodec == NULL) {
889 return DEAD_OBJECT;
890 }
891 char *name = NULL;
892 media_status_t err = AMediaCodec_getName(mAMediaCodec, &name);
893 if (err != AMEDIA_OK) {
894 return translateErrorCode(err);
895 }
896
897 *outComponentName = AString(name);
898 AMediaCodec_releaseName(mAMediaCodec, name);
899 return OK;
900}
901
902status_t AMediaCodecWrapper::configure(
903 const sp<AMediaFormatWrapper> &format,
Wei Jia28288fb2017-12-15 13:45:29 -0800904 const sp<ANativeWindowWrapper> &nww,
Wei Jia53692fa2017-12-11 10:33:46 -0800905 const sp<AMediaCryptoWrapper> &crypto,
906 uint32_t flags) {
907 if (mAMediaCodec == NULL) {
908 return DEAD_OBJECT;
909 }
910
911 media_status_t err = AMediaCodec_configure(
912 mAMediaCodec,
913 format->getAMediaFormat(),
Wei Jia28288fb2017-12-15 13:45:29 -0800914 (nww == NULL ? NULL : nww->getANativeWindow()),
Wei Jia53692fa2017-12-11 10:33:46 -0800915 crypto == NULL ? NULL : crypto->getAMediaCrypto(),
916 flags);
917
918 return translateErrorCode(err);
919}
920
921status_t AMediaCodecWrapper::setCallback(const sp<AMessage> &callback) {
922 if (mAMediaCodec == NULL) {
923 return DEAD_OBJECT;
924 }
925
926 mCallback = callback;
927
928 AMediaCodecOnAsyncNotifyCallback aCB = {
929 OnInputAvailableCB,
930 OnOutputAvailableCB,
931 OnFormatChangedCB,
932 OnErrorCB
933 };
934
935 return translateErrorCode(
936 AMediaCodec_setAsyncNotifyCallback(mAMediaCodec, aCB, callback.get()));
937}
938
939status_t AMediaCodecWrapper::releaseCrypto() {
940 if (mAMediaCodec == NULL) {
941 return DEAD_OBJECT;
942 }
943 return translateErrorCode(AMediaCodec_releaseCrypto(mAMediaCodec));
944}
945
946status_t AMediaCodecWrapper::start() {
947 if (mAMediaCodec == NULL) {
948 return DEAD_OBJECT;
949 }
950 return translateErrorCode(AMediaCodec_start(mAMediaCodec));
951}
952
953status_t AMediaCodecWrapper::stop() {
954 if (mAMediaCodec == NULL) {
955 return DEAD_OBJECT;
956 }
957 return translateErrorCode(AMediaCodec_stop(mAMediaCodec));
958}
959
960status_t AMediaCodecWrapper::flush() {
961 if (mAMediaCodec == NULL) {
962 return DEAD_OBJECT;
963 }
964 return translateErrorCode(AMediaCodec_flush(mAMediaCodec));
965}
966
967uint8_t* AMediaCodecWrapper::getInputBuffer(size_t idx, size_t *out_size) {
968 if (mAMediaCodec == NULL) {
969 return NULL;
970 }
971 return AMediaCodec_getInputBuffer(mAMediaCodec, idx, out_size);
972}
973
974uint8_t* AMediaCodecWrapper::getOutputBuffer(size_t idx, size_t *out_size) {
975 if (mAMediaCodec == NULL) {
976 return NULL;
977 }
978 return AMediaCodec_getOutputBuffer(mAMediaCodec, idx, out_size);
979}
980
981status_t AMediaCodecWrapper::queueInputBuffer(
982 size_t idx,
983 size_t offset,
984 size_t size,
985 uint64_t time,
986 uint32_t flags) {
987 if (mAMediaCodec == NULL) {
988 return DEAD_OBJECT;
989 }
990 return translateErrorCode(
991 AMediaCodec_queueInputBuffer(mAMediaCodec, idx, offset, size, time, flags));
992}
993
994status_t AMediaCodecWrapper::queueSecureInputBuffer(
995 size_t idx,
996 size_t offset,
997 sp<AMediaCodecCryptoInfoWrapper> &codecCryptoInfo,
998 uint64_t time,
999 uint32_t flags) {
1000 if (mAMediaCodec == NULL) {
1001 return DEAD_OBJECT;
1002 }
1003 return translateErrorCode(
1004 AMediaCodec_queueSecureInputBuffer(
1005 mAMediaCodec,
1006 idx,
1007 offset,
1008 codecCryptoInfo->getAMediaCodecCryptoInfo(),
1009 time,
1010 flags));
1011}
1012
1013sp<AMediaFormatWrapper> AMediaCodecWrapper::getOutputFormat() {
1014 if (mAMediaCodec == NULL) {
1015 return NULL;
1016 }
1017 return new AMediaFormatWrapper(AMediaCodec_getOutputFormat(mAMediaCodec));
1018}
1019
1020sp<AMediaFormatWrapper> AMediaCodecWrapper::getInputFormat() {
1021 if (mAMediaCodec == NULL) {
1022 return NULL;
1023 }
1024 return new AMediaFormatWrapper(AMediaCodec_getInputFormat(mAMediaCodec));
1025}
1026
1027status_t AMediaCodecWrapper::releaseOutputBuffer(size_t idx, bool render) {
1028 if (mAMediaCodec == NULL) {
1029 return DEAD_OBJECT;
1030 }
1031 return translateErrorCode(
1032 AMediaCodec_releaseOutputBuffer(mAMediaCodec, idx, render));
1033}
1034
Wei Jia28288fb2017-12-15 13:45:29 -08001035status_t AMediaCodecWrapper::setOutputSurface(const sp<ANativeWindowWrapper> &nww) {
Wei Jia53692fa2017-12-11 10:33:46 -08001036 if (mAMediaCodec == NULL) {
1037 return DEAD_OBJECT;
1038 }
1039 return translateErrorCode(
Wei Jia28288fb2017-12-15 13:45:29 -08001040 AMediaCodec_setOutputSurface(mAMediaCodec,
1041 (nww == NULL ? NULL : nww->getANativeWindow())));
Wei Jia53692fa2017-12-11 10:33:46 -08001042}
1043
1044status_t AMediaCodecWrapper::releaseOutputBufferAtTime(size_t idx, int64_t timestampNs) {
1045 if (mAMediaCodec == NULL) {
1046 return DEAD_OBJECT;
1047 }
1048 return translateErrorCode(
1049 AMediaCodec_releaseOutputBufferAtTime(mAMediaCodec, idx, timestampNs));
1050}
1051
1052status_t AMediaCodecWrapper::setParameters(const sp<AMediaFormatWrapper> &params) {
1053 if (mAMediaCodec == NULL) {
1054 return DEAD_OBJECT;
1055 }
1056 return translateErrorCode(
1057 AMediaCodec_setParameters(mAMediaCodec, params->getAMediaFormat()));
1058}
1059
Robert Shihff282cb2017-12-18 14:10:56 -08001060//////////// AMediaExtractorWrapper
1061
1062AMediaExtractorWrapper::AMediaExtractorWrapper(AMediaExtractor *aMediaExtractor)
1063 : mAMediaExtractor(aMediaExtractor) {
1064}
1065
1066AMediaExtractorWrapper::~AMediaExtractorWrapper() {
1067 release();
1068}
1069
1070status_t AMediaExtractorWrapper::release() {
1071 if (mAMediaExtractor != NULL) {
1072 media_status_t err = AMediaExtractor_delete(mAMediaExtractor);
1073 mAMediaExtractor = NULL;
1074 return translateErrorCode(err);
1075 }
1076 return OK;
1077}
1078
1079AMediaExtractor *AMediaExtractorWrapper::getAMediaExtractor() const {
1080 return mAMediaExtractor;
1081}
1082
1083status_t AMediaExtractorWrapper::setDataSource(int fd, off64_t offset, off64_t length) {
1084 if (mAMediaExtractor == NULL) {
1085 return DEAD_OBJECT;
1086 }
1087 return translateErrorCode(AMediaExtractor_setDataSourceFd(
1088 mAMediaExtractor, fd, offset, length));
1089}
1090
1091status_t AMediaExtractorWrapper::setDataSource(const char *location) {
1092 if (mAMediaExtractor == NULL) {
1093 return DEAD_OBJECT;
1094 }
1095 return translateErrorCode(AMediaExtractor_setDataSource(mAMediaExtractor, location));
1096}
1097
Robert Shihd4faf9e2018-01-21 17:52:25 -08001098status_t AMediaExtractorWrapper::setDataSource(AMediaDataSource *source) {
1099 if (mAMediaExtractor == NULL) {
1100 return DEAD_OBJECT;
1101 }
1102 return translateErrorCode(AMediaExtractor_setDataSourceCustom(mAMediaExtractor, source));
1103}
1104
Robert Shihff282cb2017-12-18 14:10:56 -08001105size_t AMediaExtractorWrapper::getTrackCount() {
1106 if (mAMediaExtractor == NULL) {
1107 return 0;
1108 }
1109 return AMediaExtractor_getTrackCount(mAMediaExtractor);
1110}
1111
Robert Shihd4faf9e2018-01-21 17:52:25 -08001112sp<AMediaFormatWrapper> AMediaExtractorWrapper::getFormat() {
1113 if (mAMediaExtractor == NULL) {
1114 return NULL;
1115 }
1116 return new AMediaFormatWrapper(AMediaExtractor_getFileFormat(mAMediaExtractor));
1117}
1118
Robert Shihff282cb2017-12-18 14:10:56 -08001119sp<AMediaFormatWrapper> AMediaExtractorWrapper::getTrackFormat(size_t idx) {
1120 if (mAMediaExtractor == NULL) {
1121 return NULL;
1122 }
1123 return new AMediaFormatWrapper(AMediaExtractor_getTrackFormat(mAMediaExtractor, idx));
1124}
1125
1126status_t AMediaExtractorWrapper::selectTrack(size_t idx) {
1127 if (mAMediaExtractor == NULL) {
1128 return DEAD_OBJECT;
1129 }
1130 return translateErrorCode(AMediaExtractor_selectTrack(mAMediaExtractor, idx));
1131}
1132
1133status_t AMediaExtractorWrapper::unselectTrack(size_t idx) {
1134 if (mAMediaExtractor == NULL) {
1135 return DEAD_OBJECT;
1136 }
1137 return translateErrorCode(AMediaExtractor_unselectTrack(mAMediaExtractor, idx));
1138}
1139
Robert Shihd4faf9e2018-01-21 17:52:25 -08001140status_t AMediaExtractorWrapper::selectSingleTrack(size_t idx) {
1141 if (mAMediaExtractor == NULL) {
1142 return DEAD_OBJECT;
1143 }
1144 for (size_t i = 0; i < AMediaExtractor_getTrackCount(mAMediaExtractor); ++i) {
1145 if (i == idx) {
1146 media_status_t err = AMediaExtractor_selectTrack(mAMediaExtractor, i);
1147 if (err != AMEDIA_OK) {
1148 return translateErrorCode(err);
1149 }
1150 } else {
1151 media_status_t err = AMediaExtractor_unselectTrack(mAMediaExtractor, i);
1152 if (err != AMEDIA_OK) {
1153 return translateErrorCode(err);
1154 }
1155 }
1156 }
1157 return OK;
1158}
1159
Robert Shihff282cb2017-12-18 14:10:56 -08001160ssize_t AMediaExtractorWrapper::readSampleData(const sp<ABuffer> &buffer) {
1161 if (mAMediaExtractor == NULL) {
1162 return -1;
1163 }
1164 return AMediaExtractor_readSampleData(mAMediaExtractor, buffer->data(), buffer->capacity());
1165}
1166
Robert Shihd4faf9e2018-01-21 17:52:25 -08001167ssize_t AMediaExtractorWrapper::getSampleSize() {
1168 if (mAMediaExtractor == NULL) {
1169 return 0;
1170 }
1171 return AMediaExtractor_getSampleSize(mAMediaExtractor);
1172}
1173
Robert Shihff282cb2017-12-18 14:10:56 -08001174uint32_t AMediaExtractorWrapper::getSampleFlags() {
1175 if (mAMediaExtractor == NULL) {
1176 return 0;
1177 }
1178 return AMediaExtractor_getSampleFlags(mAMediaExtractor);
1179}
1180
1181int AMediaExtractorWrapper::getSampleTrackIndex() {
1182 if (mAMediaExtractor == NULL) {
1183 return -1;
1184 }
1185 return AMediaExtractor_getSampleTrackIndex(mAMediaExtractor);
1186}
1187
1188int64_t AMediaExtractorWrapper::getSampleTime() {
1189 if (mAMediaExtractor == NULL) {
1190 return -1;
1191 }
1192 return AMediaExtractor_getSampleTime(mAMediaExtractor);
1193}
1194
Robert Shihd83d4f42018-02-24 19:02:46 -08001195status_t AMediaExtractorWrapper::getSampleFormat(sp<AMediaFormatWrapper> &formatWrapper) {
1196 if (mAMediaExtractor == NULL) {
1197 return DEAD_OBJECT;
1198 }
1199 AMediaFormat *format = AMediaFormat_new();
1200 formatWrapper = new AMediaFormatWrapper(format);
1201 return translateErrorCode(AMediaExtractor_getSampleFormat(mAMediaExtractor, format));
1202}
1203
Robert Shihd4faf9e2018-01-21 17:52:25 -08001204int64_t AMediaExtractorWrapper::getCachedDuration() {
1205 if (mAMediaExtractor == NULL) {
1206 return -1;
1207 }
1208 return AMediaExtractor_getCachedDuration(mAMediaExtractor);
1209}
1210
Robert Shihff282cb2017-12-18 14:10:56 -08001211bool AMediaExtractorWrapper::advance() {
1212 if (mAMediaExtractor == NULL) {
1213 return false;
1214 }
1215 return AMediaExtractor_advance(mAMediaExtractor);
1216}
1217
Robert Shihd4faf9e2018-01-21 17:52:25 -08001218status_t AMediaExtractorWrapper::seekTo(int64_t seekPosUs, MediaSource::ReadOptions::SeekMode mode) {
Robert Shihff282cb2017-12-18 14:10:56 -08001219 if (mAMediaExtractor == NULL) {
1220 return DEAD_OBJECT;
1221 }
Robert Shihd4faf9e2018-01-21 17:52:25 -08001222
1223 SeekMode aMode;
1224 switch (mode) {
1225 case MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC: {
1226 aMode = AMEDIAEXTRACTOR_SEEK_PREVIOUS_SYNC;
1227 break;
1228 }
1229 case MediaSource::ReadOptions::SEEK_NEXT_SYNC: {
1230 aMode = AMEDIAEXTRACTOR_SEEK_NEXT_SYNC;
1231 break;
1232 }
1233 default: {
1234 aMode = AMEDIAEXTRACTOR_SEEK_CLOSEST_SYNC;
1235 break;
1236 }
1237 }
1238 return AMediaExtractor_seekTo(mAMediaExtractor, seekPosUs, aMode);
Robert Shihff282cb2017-12-18 14:10:56 -08001239}
1240
1241PsshInfo* AMediaExtractorWrapper::getPsshInfo() {
1242 if (mAMediaExtractor == NULL) {
1243 return NULL;
1244 }
1245 return AMediaExtractor_getPsshInfo(mAMediaExtractor);
1246}
1247
1248sp<AMediaCodecCryptoInfoWrapper> AMediaExtractorWrapper::getSampleCryptoInfo() {
1249 if (mAMediaExtractor == NULL) {
1250 return NULL;
1251 }
1252 return new AMediaCodecCryptoInfoWrapper(AMediaExtractor_getSampleCryptoInfo(mAMediaExtractor));
1253}
1254
Robert Shih4d432f12018-11-01 12:29:06 -07001255AMediaDataSourceWrapper::AMediaDataSourceWrapper(const sp<DataSource> &dataSource)
1256 : mDataSource(dataSource),
1257 mAMediaDataSource(convertDataSourceToAMediaDataSource(dataSource)) {
1258}
1259
Robert Shih49fb89d2018-01-31 17:53:19 -08001260AMediaDataSourceWrapper::AMediaDataSourceWrapper(AMediaDataSource *aDataSource)
Robert Shih4d432f12018-11-01 12:29:06 -07001261 : mDataSource(NULL),
1262 mAMediaDataSource(aDataSource) {
Robert Shihd4faf9e2018-01-21 17:52:25 -08001263}
1264
1265AMediaDataSourceWrapper::~AMediaDataSourceWrapper() {
1266 if (mAMediaDataSource == NULL) {
1267 return;
1268 }
Robert Shih49fb89d2018-01-31 17:53:19 -08001269 AMediaDataSource_close(mAMediaDataSource);
Robert Shihd4faf9e2018-01-21 17:52:25 -08001270 AMediaDataSource_delete(mAMediaDataSource);
1271 mAMediaDataSource = NULL;
1272}
1273
1274AMediaDataSource* AMediaDataSourceWrapper::getAMediaDataSource() {
1275 return mAMediaDataSource;
1276}
1277
Robert Shih49fb89d2018-01-31 17:53:19 -08001278void AMediaDataSourceWrapper::close() {
1279 AMediaDataSource_close(mAMediaDataSource);
1280}
1281
Wei Jia53692fa2017-12-11 10:33:46 -08001282} // namespace android