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