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