blob: 2cdb44e4ab44ba20bfb73ed18dd84db8224444b9 [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
34namespace android {
35
36static const size_t kAESBlockSize = 16; // AES_BLOCK_SIZE
37
38static const char *AMediaFormatKeyGroupInt32[] = {
39 AMEDIAFORMAT_KEY_AAC_DRC_ATTENUATION_FACTOR,
40 AMEDIAFORMAT_KEY_AAC_DRC_BOOST_FACTOR,
41 AMEDIAFORMAT_KEY_AAC_DRC_HEAVY_COMPRESSION,
42 AMEDIAFORMAT_KEY_AAC_DRC_TARGET_REFERENCE_LEVEL,
43 AMEDIAFORMAT_KEY_AAC_ENCODED_TARGET_LEVEL,
44 AMEDIAFORMAT_KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT,
45 AMEDIAFORMAT_KEY_AAC_PROFILE,
46 AMEDIAFORMAT_KEY_AAC_SBR_MODE,
47 AMEDIAFORMAT_KEY_AUDIO_SESSION_ID,
48 AMEDIAFORMAT_KEY_BITRATE_MODE,
49 AMEDIAFORMAT_KEY_BIT_RATE,
50 AMEDIAFORMAT_KEY_CAPTURE_RATE,
51 AMEDIAFORMAT_KEY_CHANNEL_COUNT,
52 AMEDIAFORMAT_KEY_CHANNEL_MASK,
53 AMEDIAFORMAT_KEY_COLOR_FORMAT,
54 AMEDIAFORMAT_KEY_COLOR_RANGE,
55 AMEDIAFORMAT_KEY_COLOR_STANDARD,
56 AMEDIAFORMAT_KEY_COLOR_TRANSFER,
57 AMEDIAFORMAT_KEY_COMPLEXITY,
58 AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL,
59 AMEDIAFORMAT_KEY_GRID_COLS,
60 AMEDIAFORMAT_KEY_GRID_HEIGHT,
61 AMEDIAFORMAT_KEY_GRID_ROWS,
62 AMEDIAFORMAT_KEY_GRID_WIDTH,
63 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,
87 AMEDIAFORMAT_KEY_TRACK_INDEX,
Wei Jia53692fa2017-12-11 10:33:46 -080088};
89
90static const char *AMediaFormatKeyGroupInt64[] = {
91 AMEDIAFORMAT_KEY_DURATION,
92 AMEDIAFORMAT_KEY_REPEAT_PREVIOUS_FRAME_AFTER,
Robert Shih0cd95062018-01-21 17:41:16 -080093 AMEDIAFORMAT_KEY_TIME_US,
Wei Jia53692fa2017-12-11 10:33:46 -080094};
95
96static const char *AMediaFormatKeyGroupString[] = {
97 AMEDIAFORMAT_KEY_LANGUAGE,
98 AMEDIAFORMAT_KEY_MIME,
99 AMEDIAFORMAT_KEY_TEMPORAL_LAYERING,
100};
101
102static const char *AMediaFormatKeyGroupBuffer[] = {
103 AMEDIAFORMAT_KEY_HDR_STATIC_INFO,
Robert Shih0cd95062018-01-21 17:41:16 -0800104 AMEDIAFORMAT_KEY_SEI,
105 AMEDIAFORMAT_KEY_MPEG_USER_DATA,
106};
107
108static const char *AMediaFormatKeyGroupCsd[] = {
109 AMEDIAFORMAT_KEY_CSD_0,
110 AMEDIAFORMAT_KEY_CSD_1,
111 AMEDIAFORMAT_KEY_CSD_2,
Wei Jia53692fa2017-12-11 10:33:46 -0800112};
113
114static const char *AMediaFormatKeyGroupRect[] = {
115 AMEDIAFORMAT_KEY_DISPLAY_CROP,
116};
117
118static const char *AMediaFormatKeyGroupFloatInt32[] = {
119 AMEDIAFORMAT_KEY_FRAME_RATE,
120 AMEDIAFORMAT_KEY_I_FRAME_INTERVAL,
121 AMEDIAFORMAT_KEY_OPERATING_RATE,
122};
123
124static status_t translateErrorCode(media_status_t err) {
125 if (err == AMEDIA_OK) {
126 return OK;
Robert Shihd83d4f42018-02-24 19:02:46 -0800127 } else if (err == AMEDIA_ERROR_END_OF_STREAM) {
128 return ERROR_END_OF_STREAM;
129 } else if (err == AMEDIA_ERROR_IO) {
130 return ERROR_IO;
Wei Jia53692fa2017-12-11 10:33:46 -0800131 } else if (err == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
132 return -EAGAIN;
133 }
134
135 ALOGE("ndk error code: %d", err);
136 return UNKNOWN_ERROR;
137}
138
139static int32_t translateActionCode(int32_t actionCode) {
140 if (AMediaCodecActionCode_isTransient(actionCode)) {
141 return ACTION_CODE_TRANSIENT;
142 } else if (AMediaCodecActionCode_isRecoverable(actionCode)) {
143 return ACTION_CODE_RECOVERABLE;
144 }
145 return ACTION_CODE_FATAL;
146}
147
148static CryptoPlugin::Mode translateToCryptoPluginMode(cryptoinfo_mode_t mode) {
149 CryptoPlugin::Mode ret = CryptoPlugin::kMode_Unencrypted;
150 switch (mode) {
151 case AMEDIACODECRYPTOINFO_MODE_AES_CTR: {
152 ret = CryptoPlugin::kMode_AES_CTR;
153 break;
154 }
155
156 case AMEDIACODECRYPTOINFO_MODE_AES_WV: {
157 ret = CryptoPlugin::kMode_AES_WV;
158 break;
159 }
160
161 case AMEDIACODECRYPTOINFO_MODE_AES_CBC: {
162 ret = CryptoPlugin::kMode_AES_CBC;
163 break;
164 }
165
166 default:
167 break;
168 }
169
170 return ret;
171}
172
173static cryptoinfo_mode_t translateToCryptoInfoMode(CryptoPlugin::Mode mode) {
174 cryptoinfo_mode_t ret = AMEDIACODECRYPTOINFO_MODE_CLEAR;
175 switch (mode) {
176 case CryptoPlugin::kMode_AES_CTR: {
177 ret = AMEDIACODECRYPTOINFO_MODE_AES_CTR;
178 break;
179 }
180
181 case CryptoPlugin::kMode_AES_WV: {
182 ret = AMEDIACODECRYPTOINFO_MODE_AES_WV;
183 break;
184 }
185
186 case CryptoPlugin::kMode_AES_CBC: {
187 ret = AMEDIACODECRYPTOINFO_MODE_AES_CBC;
188 break;
189 }
190
191 default:
192 break;
193 }
194
195 return ret;
196}
197
Wei Jia53692fa2017-12-11 10:33:46 -0800198//////////// AMediaFormatWrapper
199// static
200sp<AMediaFormatWrapper> AMediaFormatWrapper::Create(const sp<AMessage> &message) {
201 sp<AMediaFormatWrapper> aMediaFormat = new AMediaFormatWrapper();
202
203 for (size_t i = 0; i < message->countEntries(); ++i) {
204 AMessage::Type valueType;
205 const char *key = message->getEntryNameAt(i, &valueType);
206
207 switch (valueType) {
208 case AMessage::kTypeInt32: {
209 int32_t val;
210 if (!message->findInt32(key, &val)) {
211 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
212 continue;
213 }
214 aMediaFormat->setInt32(key, val);
215 break;
216 }
217
218 case AMessage::kTypeInt64: {
219 int64_t val;
220 if (!message->findInt64(key, &val)) {
221 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
222 continue;
223 }
224 aMediaFormat->setInt64(key, val);
225 break;
226 }
227
228 case AMessage::kTypeFloat: {
229 float val;
230 if (!message->findFloat(key, &val)) {
231 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
232 continue;
233 }
234 aMediaFormat->setFloat(key, val);
235 break;
236 }
237
238 case AMessage::kTypeDouble: {
239 double val;
240 if (!message->findDouble(key, &val)) {
241 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
242 continue;
243 }
244 aMediaFormat->setDouble(key, val);
245 break;
246 }
247
248 case AMessage::kTypeSize: {
249 size_t val;
250 if (!message->findSize(key, &val)) {
251 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
252 continue;
253 }
254 aMediaFormat->setSize(key, val);
255 break;
256 }
257
258 case AMessage::kTypeRect: {
259 int32_t left, top, right, bottom;
260 if (!message->findRect(key, &left, &top, &right, &bottom)) {
261 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
262 continue;
263 }
264 aMediaFormat->setRect(key, left, top, right, bottom);
265 break;
266 }
267
268 case AMessage::kTypeString: {
269 AString val;
270 if (!message->findString(key, &val)) {
271 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
272 continue;
273 }
274 aMediaFormat->setString(key, val);
275 break;
276 }
277
278 case AMessage::kTypeBuffer: {
279 sp<ABuffer> val;
280 if (!message->findBuffer(key, &val)) {
281 ALOGE("AMediaFormatWrapper::Create: error at item %zu", i);
282 continue;
283 }
284 aMediaFormat->setBuffer(key, val->data(), val->size());
285 break;
286 }
287
288 default: {
289 break;
290 }
291 }
292 }
293
294 return aMediaFormat;
295}
296
297AMediaFormatWrapper::AMediaFormatWrapper() {
298 mAMediaFormat = AMediaFormat_new();
299}
300
301AMediaFormatWrapper::AMediaFormatWrapper(AMediaFormat *aMediaFormat)
302 : mAMediaFormat(aMediaFormat) {
303}
304
305AMediaFormatWrapper::~AMediaFormatWrapper() {
306 release();
307}
308
309status_t AMediaFormatWrapper::release() {
310 if (mAMediaFormat != NULL) {
311 media_status_t err = AMediaFormat_delete(mAMediaFormat);
312 mAMediaFormat = NULL;
313 return translateErrorCode(err);
314 }
315 return OK;
316}
317
318AMediaFormat *AMediaFormatWrapper::getAMediaFormat() const {
319 return mAMediaFormat;
320}
321
322sp<AMessage> AMediaFormatWrapper::toAMessage() const {
Robert Shih0cd95062018-01-21 17:41:16 -0800323 sp<AMessage> msg;
324 writeToAMessage(msg);
325 return msg;
326}
327
328void AMediaFormatWrapper::writeToAMessage(sp<AMessage> &msg) const {
Wei Jia53692fa2017-12-11 10:33:46 -0800329 if (mAMediaFormat == NULL) {
Robert Shih0cd95062018-01-21 17:41:16 -0800330 msg = NULL;
Wei Jia53692fa2017-12-11 10:33:46 -0800331 }
332
Robert Shih0cd95062018-01-21 17:41:16 -0800333 if (msg == NULL) {
334 msg = new AMessage;
335 }
Wei Jia53692fa2017-12-11 10:33:46 -0800336 for (auto& key : AMediaFormatKeyGroupInt32) {
337 int32_t val;
338 if (getInt32(key, &val)) {
339 msg->setInt32(key, val);
340 }
341 }
342 for (auto& key : AMediaFormatKeyGroupInt64) {
343 int64_t val;
344 if (getInt64(key, &val)) {
345 msg->setInt64(key, val);
346 }
347 }
348 for (auto& key : AMediaFormatKeyGroupString) {
349 AString val;
350 if (getString(key, &val)) {
351 msg->setString(key, val);
352 }
353 }
354 for (auto& key : AMediaFormatKeyGroupBuffer) {
355 void *data;
356 size_t size;
357 if (getBuffer(key, &data, &size)) {
358 sp<ABuffer> buffer = ABuffer::CreateAsCopy(data, size);
359 msg->setBuffer(key, buffer);
360 }
361 }
Robert Shih0cd95062018-01-21 17:41:16 -0800362 for (auto& key : AMediaFormatKeyGroupCsd) {
363 void *data;
364 size_t size;
365 if (getBuffer(key, &data, &size)) {
366 sp<ABuffer> buffer = ABuffer::CreateAsCopy(data, size);
367 buffer->meta()->setInt32(AMEDIAFORMAT_KEY_CSD, 1);
368 buffer->meta()->setInt64(AMEDIAFORMAT_KEY_TIME_US, 0);
369 msg->setBuffer(key, buffer);
370 }
371 }
Wei Jia53692fa2017-12-11 10:33:46 -0800372 for (auto& key : AMediaFormatKeyGroupRect) {
373 int32_t left, top, right, bottom;
374 if (getRect(key, &left, &top, &right, &bottom)) {
375 msg->setRect(key, left, top, right, bottom);
376 }
377 }
378 for (auto& key : AMediaFormatKeyGroupFloatInt32) {
379 float valFloat;
380 if (getFloat(key, &valFloat)) {
381 msg->setFloat(key, valFloat);
382 } else {
383 int32_t valInt32;
384 if (getInt32(key, &valInt32)) {
385 msg->setFloat(key, (float)valInt32);
386 }
387 }
388 }
Wei Jia53692fa2017-12-11 10:33:46 -0800389}
390
391const char* AMediaFormatWrapper::toString() const {
392 if (mAMediaFormat == NULL) {
393 return NULL;
394 }
395 return AMediaFormat_toString(mAMediaFormat);
396}
397
398bool AMediaFormatWrapper::getInt32(const char *name, int32_t *out) const {
399 if (mAMediaFormat == NULL) {
400 return false;
401 }
402 return AMediaFormat_getInt32(mAMediaFormat, name, out);
403}
404
405bool AMediaFormatWrapper::getInt64(const char *name, int64_t *out) const {
406 if (mAMediaFormat == NULL) {
407 return false;
408 }
409 return AMediaFormat_getInt64(mAMediaFormat, name, out);
410}
411
412bool AMediaFormatWrapper::getFloat(const char *name, float *out) const {
413 if (mAMediaFormat == NULL) {
414 return false;
415 }
416 return AMediaFormat_getFloat(mAMediaFormat, name, out);
417}
418
419bool AMediaFormatWrapper::getDouble(const char *name, double *out) const {
420 if (mAMediaFormat == NULL) {
421 return false;
422 }
423 return AMediaFormat_getDouble(mAMediaFormat, name, out);
424}
425
426bool AMediaFormatWrapper::getSize(const char *name, size_t *out) const {
427 if (mAMediaFormat == NULL) {
428 return false;
429 }
430 return AMediaFormat_getSize(mAMediaFormat, name, out);
431}
432
433bool AMediaFormatWrapper::getRect(
434 const char *name, int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const {
435 if (mAMediaFormat == NULL) {
436 return false;
437 }
438 return AMediaFormat_getRect(mAMediaFormat, name, left, top, right, bottom);
439}
440
441bool AMediaFormatWrapper::getBuffer(const char *name, void** data, size_t *outSize) const {
442 if (mAMediaFormat == NULL) {
443 return false;
444 }
445 return AMediaFormat_getBuffer(mAMediaFormat, name, data, outSize);
446}
447
448bool AMediaFormatWrapper::getString(const char *name, AString *out) const {
449 if (mAMediaFormat == NULL) {
450 return false;
451 }
452 const char *outChar = NULL;
453 bool ret = AMediaFormat_getString(mAMediaFormat, name, &outChar);
454 if (ret) {
455 *out = AString(outChar);
456 }
457 return ret;
458}
459
460void AMediaFormatWrapper::setInt32(const char* name, int32_t value) {
461 if (mAMediaFormat != NULL) {
462 AMediaFormat_setInt32(mAMediaFormat, name, value);
463 }
464}
465
466void AMediaFormatWrapper::setInt64(const char* name, int64_t value) {
467 if (mAMediaFormat != NULL) {
468 AMediaFormat_setInt64(mAMediaFormat, name, value);
469 }
470}
471
472void AMediaFormatWrapper::setFloat(const char* name, float value) {
473 if (mAMediaFormat != NULL) {
474 AMediaFormat_setFloat(mAMediaFormat, name, value);
475 }
476}
477
478void AMediaFormatWrapper::setDouble(const char* name, double value) {
479 if (mAMediaFormat != NULL) {
480 AMediaFormat_setDouble(mAMediaFormat, name, value);
481 }
482}
483
484void AMediaFormatWrapper::setSize(const char* name, size_t value) {
485 if (mAMediaFormat != NULL) {
486 AMediaFormat_setSize(mAMediaFormat, name, value);
487 }
488}
489
490void AMediaFormatWrapper::setRect(
491 const char* name, int32_t left, int32_t top, int32_t right, int32_t bottom) {
492 if (mAMediaFormat != NULL) {
493 AMediaFormat_setRect(mAMediaFormat, name, left, top, right, bottom);
494 }
495}
496
497void AMediaFormatWrapper::setString(const char* name, const AString &value) {
498 if (mAMediaFormat != NULL) {
499 AMediaFormat_setString(mAMediaFormat, name, value.c_str());
500 }
501}
502
503void AMediaFormatWrapper::setBuffer(const char* name, void* data, size_t size) {
504 if (mAMediaFormat != NULL) {
505 AMediaFormat_setBuffer(mAMediaFormat, name, data, size);
506 }
507}
508
509
Wei Jia28288fb2017-12-15 13:45:29 -0800510//////////// ANativeWindowWrapper
511ANativeWindowWrapper::ANativeWindowWrapper(ANativeWindow *aNativeWindow)
512 : mANativeWindow(aNativeWindow) {
513 if (aNativeWindow != NULL) {
514 ANativeWindow_acquire(aNativeWindow);
515 }
516}
517
518ANativeWindowWrapper::~ANativeWindowWrapper() {
519 release();
520}
521
522status_t ANativeWindowWrapper::release() {
523 if (mANativeWindow != NULL) {
524 ANativeWindow_release(mANativeWindow);
525 mANativeWindow = NULL;
526 }
527 return OK;
528}
529
530ANativeWindow *ANativeWindowWrapper::getANativeWindow() const {
531 return mANativeWindow;
532}
533
534
Wei Jia53692fa2017-12-11 10:33:46 -0800535//////////// AMediaDrmWrapper
536AMediaDrmWrapper::AMediaDrmWrapper(const uint8_t uuid[16]) {
537 mAMediaDrm = AMediaDrm_createByUUID(uuid);
538}
539
540AMediaDrmWrapper::AMediaDrmWrapper(AMediaDrm *aMediaDrm)
541 : mAMediaDrm(aMediaDrm) {
542}
543
544AMediaDrmWrapper::~AMediaDrmWrapper() {
545 release();
546}
547
548status_t AMediaDrmWrapper::release() {
549 if (mAMediaDrm != NULL) {
550 AMediaDrm_release(mAMediaDrm);
551 mAMediaDrm = NULL;
552 }
553 return OK;
554}
555
556AMediaDrm *AMediaDrmWrapper::getAMediaDrm() const {
557 return mAMediaDrm;
558}
559
560// static
561bool AMediaDrmWrapper::isCryptoSchemeSupported(
562 const uint8_t uuid[16],
563 const char *mimeType) {
564 return AMediaDrm_isCryptoSchemeSupported(uuid, mimeType);
565}
566
567
568//////////// AMediaCryptoWrapper
569AMediaCryptoWrapper::AMediaCryptoWrapper(
570 const uint8_t uuid[16], const void *initData, size_t initDataSize) {
571 mAMediaCrypto = AMediaCrypto_new(uuid, initData, initDataSize);
572}
573
574AMediaCryptoWrapper::AMediaCryptoWrapper(AMediaCrypto *aMediaCrypto)
575 : mAMediaCrypto(aMediaCrypto) {
576}
577
578AMediaCryptoWrapper::~AMediaCryptoWrapper() {
579 release();
580}
581
582status_t AMediaCryptoWrapper::release() {
583 if (mAMediaCrypto != NULL) {
584 AMediaCrypto_delete(mAMediaCrypto);
585 mAMediaCrypto = NULL;
586 }
587 return OK;
588}
589
590AMediaCrypto *AMediaCryptoWrapper::getAMediaCrypto() const {
591 return mAMediaCrypto;
592}
593
594bool AMediaCryptoWrapper::isCryptoSchemeSupported(const uint8_t uuid[16]) {
595 if (mAMediaCrypto == NULL) {
596 return false;
597 }
598 return AMediaCrypto_isCryptoSchemeSupported(uuid);
599}
600
601bool AMediaCryptoWrapper::requiresSecureDecoderComponent(const char *mime) {
602 if (mAMediaCrypto == NULL) {
603 return false;
604 }
605 return AMediaCrypto_requiresSecureDecoderComponent(mime);
606}
607
608
609//////////// AMediaCodecCryptoInfoWrapper
610// static
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800611sp<AMediaCodecCryptoInfoWrapper> AMediaCodecCryptoInfoWrapper::Create(MetaDataBase &meta) {
Wei Jia53692fa2017-12-11 10:33:46 -0800612
613 uint32_t type;
614 const void *crypteddata;
615 size_t cryptedsize;
616
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800617 if (!meta.findData(kKeyEncryptedSizes, &type, &crypteddata, &cryptedsize)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800618 return NULL;
619 }
620
621 int numSubSamples = cryptedsize / sizeof(size_t);
622
623 if (numSubSamples <= 0) {
624 ALOGE("Create: INVALID numSubSamples: %d", numSubSamples);
625 return NULL;
626 }
627
628 const void *cleardata;
629 size_t clearsize;
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800630 if (meta.findData(kKeyPlainSizes, &type, &cleardata, &clearsize)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800631 if (clearsize != cryptedsize) {
632 // The two must be of the same length.
633 ALOGE("Create: mismatch cryptedsize: %zu != clearsize: %zu", cryptedsize, clearsize);
634 return NULL;
635 }
636 }
637
638 const void *key;
639 size_t keysize;
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800640 if (meta.findData(kKeyCryptoKey, &type, &key, &keysize)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800641 if (keysize != kAESBlockSize) {
642 // Keys must be 16 bytes in length.
643 ALOGE("Create: Keys must be %zu bytes in length: %zu", kAESBlockSize, keysize);
644 return NULL;
645 }
646 }
647
648 const void *iv;
649 size_t ivsize;
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800650 if (meta.findData(kKeyCryptoIV, &type, &iv, &ivsize)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800651 if (ivsize != kAESBlockSize) {
652 // IVs must be 16 bytes in length.
653 ALOGE("Create: IV must be %zu bytes in length: %zu", kAESBlockSize, ivsize);
654 return NULL;
655 }
656 }
657
658 int32_t mode;
Marco Nelissen3d21ae32018-02-16 08:24:08 -0800659 if (!meta.findInt32(kKeyCryptoMode, &mode)) {
Wei Jia53692fa2017-12-11 10:33:46 -0800660 mode = CryptoPlugin::kMode_AES_CTR;
661 }
662
663 return new AMediaCodecCryptoInfoWrapper(
664 numSubSamples,
665 (uint8_t*) key,
666 (uint8_t*) iv,
667 (CryptoPlugin::Mode)mode,
668 (size_t*) cleardata,
669 (size_t*) crypteddata);
670}
671
672AMediaCodecCryptoInfoWrapper::AMediaCodecCryptoInfoWrapper(
673 int numsubsamples,
674 uint8_t key[16],
675 uint8_t iv[16],
676 CryptoPlugin::Mode mode,
677 size_t *clearbytes,
678 size_t *encryptedbytes) {
679 mAMediaCodecCryptoInfo =
680 AMediaCodecCryptoInfo_new(numsubsamples,
681 key,
682 iv,
683 translateToCryptoInfoMode(mode),
684 clearbytes,
685 encryptedbytes);
686}
687
688AMediaCodecCryptoInfoWrapper::AMediaCodecCryptoInfoWrapper(
689 AMediaCodecCryptoInfo *aMediaCodecCryptoInfo)
690 : mAMediaCodecCryptoInfo(aMediaCodecCryptoInfo) {
691}
692
693AMediaCodecCryptoInfoWrapper::~AMediaCodecCryptoInfoWrapper() {
694 release();
695}
696
697status_t AMediaCodecCryptoInfoWrapper::release() {
698 if (mAMediaCodecCryptoInfo != NULL) {
699 media_status_t err = AMediaCodecCryptoInfo_delete(mAMediaCodecCryptoInfo);
700 mAMediaCodecCryptoInfo = NULL;
701 return translateErrorCode(err);
702 }
703 return OK;
704}
705
706AMediaCodecCryptoInfo *AMediaCodecCryptoInfoWrapper::getAMediaCodecCryptoInfo() const {
707 return mAMediaCodecCryptoInfo;
708}
709
710void AMediaCodecCryptoInfoWrapper::setPattern(CryptoPlugin::Pattern *pattern) {
711 if (mAMediaCodecCryptoInfo == NULL || pattern == NULL) {
712 return;
713 }
714 cryptoinfo_pattern_t ndkPattern = {(int32_t)pattern->mEncryptBlocks,
715 (int32_t)pattern->mSkipBlocks };
716 return AMediaCodecCryptoInfo_setPattern(mAMediaCodecCryptoInfo, &ndkPattern);
717}
718
719size_t AMediaCodecCryptoInfoWrapper::getNumSubSamples() {
720 if (mAMediaCodecCryptoInfo == NULL) {
721 return 0;
722 }
723 return AMediaCodecCryptoInfo_getNumSubSamples(mAMediaCodecCryptoInfo);
724}
725
726status_t AMediaCodecCryptoInfoWrapper::getKey(uint8_t *dst) {
727 if (mAMediaCodecCryptoInfo == NULL) {
728 return DEAD_OBJECT;
729 }
730 if (dst == NULL) {
731 return BAD_VALUE;
732 }
733 return translateErrorCode(
734 AMediaCodecCryptoInfo_getKey(mAMediaCodecCryptoInfo, dst));
735}
736
737status_t AMediaCodecCryptoInfoWrapper::getIV(uint8_t *dst) {
738 if (mAMediaCodecCryptoInfo == NULL) {
739 return DEAD_OBJECT;
740 }
741 if (dst == NULL) {
742 return BAD_VALUE;
743 }
744 return translateErrorCode(
745 AMediaCodecCryptoInfo_getIV(mAMediaCodecCryptoInfo, dst));
746}
747
748CryptoPlugin::Mode AMediaCodecCryptoInfoWrapper::getMode() {
749 if (mAMediaCodecCryptoInfo == NULL) {
750 return CryptoPlugin::kMode_Unencrypted;
751 }
752 return translateToCryptoPluginMode(
753 AMediaCodecCryptoInfo_getMode(mAMediaCodecCryptoInfo));
754}
755
756status_t AMediaCodecCryptoInfoWrapper::getClearBytes(size_t *dst) {
757 if (mAMediaCodecCryptoInfo == NULL) {
758 return DEAD_OBJECT;
759 }
760 if (dst == NULL) {
761 return BAD_VALUE;
762 }
763 return translateErrorCode(
764 AMediaCodecCryptoInfo_getClearBytes(mAMediaCodecCryptoInfo, dst));
765}
766
767status_t AMediaCodecCryptoInfoWrapper::getEncryptedBytes(size_t *dst) {
768 if (mAMediaCodecCryptoInfo == NULL) {
769 return DEAD_OBJECT;
770 }
771 if (dst == NULL) {
772 return BAD_VALUE;
773 }
774 return translateErrorCode(
775 AMediaCodecCryptoInfo_getEncryptedBytes(mAMediaCodecCryptoInfo, dst));
776}
777
778
779//////////// AMediaCodecWrapper
780// static
781sp<AMediaCodecWrapper> AMediaCodecWrapper::CreateCodecByName(const AString &name) {
782 AMediaCodec *aMediaCodec = AMediaCodec_createCodecByName(name.c_str());
783 return new AMediaCodecWrapper(aMediaCodec);
784}
785
786// static
787sp<AMediaCodecWrapper> AMediaCodecWrapper::CreateDecoderByType(const AString &mimeType) {
788 AMediaCodec *aMediaCodec = AMediaCodec_createDecoderByType(mimeType.c_str());
789 return new AMediaCodecWrapper(aMediaCodec);
790}
791
792// static
793void AMediaCodecWrapper::OnInputAvailableCB(
794 AMediaCodec * /* aMediaCodec */,
795 void *userdata,
796 int32_t index) {
797 ALOGV("OnInputAvailableCB: index(%d)", index);
798 sp<AMessage> msg = sp<AMessage>((AMessage *)userdata)->dup();
799 msg->setInt32("callbackID", CB_INPUT_AVAILABLE);
800 msg->setInt32("index", index);
801 msg->post();
802}
803
804// static
805void AMediaCodecWrapper::OnOutputAvailableCB(
806 AMediaCodec * /* aMediaCodec */,
807 void *userdata,
808 int32_t index,
809 AMediaCodecBufferInfo *bufferInfo) {
810 ALOGV("OnOutputAvailableCB: index(%d), (%d, %d, %lld, 0x%x)",
811 index, bufferInfo->offset, bufferInfo->size,
812 (long long)bufferInfo->presentationTimeUs, bufferInfo->flags);
813 sp<AMessage> msg = sp<AMessage>((AMessage *)userdata)->dup();
814 msg->setInt32("callbackID", CB_OUTPUT_AVAILABLE);
815 msg->setInt32("index", index);
816 msg->setSize("offset", (size_t)(bufferInfo->offset));
817 msg->setSize("size", (size_t)(bufferInfo->size));
818 msg->setInt64("timeUs", bufferInfo->presentationTimeUs);
819 msg->setInt32("flags", (int32_t)(bufferInfo->flags));
820 msg->post();
821}
822
823// static
824void AMediaCodecWrapper::OnFormatChangedCB(
825 AMediaCodec * /* aMediaCodec */,
826 void *userdata,
827 AMediaFormat *format) {
828 sp<AMediaFormatWrapper> formatWrapper = new AMediaFormatWrapper(format);
829 sp<AMessage> outputFormat = formatWrapper->toAMessage();
830 ALOGV("OnFormatChangedCB: format(%s)", outputFormat->debugString().c_str());
831
832 sp<AMessage> msg = sp<AMessage>((AMessage *)userdata)->dup();
833 msg->setInt32("callbackID", CB_OUTPUT_FORMAT_CHANGED);
834 msg->setMessage("format", outputFormat);
835 msg->post();
836}
837
838// static
839void AMediaCodecWrapper::OnErrorCB(
840 AMediaCodec * /* aMediaCodec */,
841 void *userdata,
842 media_status_t err,
843 int32_t actionCode,
844 const char *detail) {
845 ALOGV("OnErrorCB: err(%d), actionCode(%d), detail(%s)", err, actionCode, detail);
846 sp<AMessage> msg = sp<AMessage>((AMessage *)userdata)->dup();
847 msg->setInt32("callbackID", CB_ERROR);
848 msg->setInt32("err", translateErrorCode(err));
849 msg->setInt32("actionCode", translateActionCode(actionCode));
850 msg->setString("detail", detail);
851 msg->post();
852}
853
854AMediaCodecWrapper::AMediaCodecWrapper(AMediaCodec *aMediaCodec)
855 : mAMediaCodec(aMediaCodec) {
856}
857
858AMediaCodecWrapper::~AMediaCodecWrapper() {
859 release();
860}
861
862status_t AMediaCodecWrapper::release() {
863 if (mAMediaCodec != NULL) {
864 AMediaCodecOnAsyncNotifyCallback aCB = {};
865 AMediaCodec_setAsyncNotifyCallback(mAMediaCodec, aCB, NULL);
866 mCallback = NULL;
867
868 media_status_t err = AMediaCodec_delete(mAMediaCodec);
869 mAMediaCodec = NULL;
870 return translateErrorCode(err);
871 }
872 return OK;
873}
874
875AMediaCodec *AMediaCodecWrapper::getAMediaCodec() const {
876 return mAMediaCodec;
877}
878
879status_t AMediaCodecWrapper::getName(AString *outComponentName) const {
880 if (mAMediaCodec == NULL) {
881 return DEAD_OBJECT;
882 }
883 char *name = NULL;
884 media_status_t err = AMediaCodec_getName(mAMediaCodec, &name);
885 if (err != AMEDIA_OK) {
886 return translateErrorCode(err);
887 }
888
889 *outComponentName = AString(name);
890 AMediaCodec_releaseName(mAMediaCodec, name);
891 return OK;
892}
893
894status_t AMediaCodecWrapper::configure(
895 const sp<AMediaFormatWrapper> &format,
Wei Jia28288fb2017-12-15 13:45:29 -0800896 const sp<ANativeWindowWrapper> &nww,
Wei Jia53692fa2017-12-11 10:33:46 -0800897 const sp<AMediaCryptoWrapper> &crypto,
898 uint32_t flags) {
899 if (mAMediaCodec == NULL) {
900 return DEAD_OBJECT;
901 }
902
903 media_status_t err = AMediaCodec_configure(
904 mAMediaCodec,
905 format->getAMediaFormat(),
Wei Jia28288fb2017-12-15 13:45:29 -0800906 (nww == NULL ? NULL : nww->getANativeWindow()),
Wei Jia53692fa2017-12-11 10:33:46 -0800907 crypto == NULL ? NULL : crypto->getAMediaCrypto(),
908 flags);
909
910 return translateErrorCode(err);
911}
912
913status_t AMediaCodecWrapper::setCallback(const sp<AMessage> &callback) {
914 if (mAMediaCodec == NULL) {
915 return DEAD_OBJECT;
916 }
917
918 mCallback = callback;
919
920 AMediaCodecOnAsyncNotifyCallback aCB = {
921 OnInputAvailableCB,
922 OnOutputAvailableCB,
923 OnFormatChangedCB,
924 OnErrorCB
925 };
926
927 return translateErrorCode(
928 AMediaCodec_setAsyncNotifyCallback(mAMediaCodec, aCB, callback.get()));
929}
930
931status_t AMediaCodecWrapper::releaseCrypto() {
932 if (mAMediaCodec == NULL) {
933 return DEAD_OBJECT;
934 }
935 return translateErrorCode(AMediaCodec_releaseCrypto(mAMediaCodec));
936}
937
938status_t AMediaCodecWrapper::start() {
939 if (mAMediaCodec == NULL) {
940 return DEAD_OBJECT;
941 }
942 return translateErrorCode(AMediaCodec_start(mAMediaCodec));
943}
944
945status_t AMediaCodecWrapper::stop() {
946 if (mAMediaCodec == NULL) {
947 return DEAD_OBJECT;
948 }
949 return translateErrorCode(AMediaCodec_stop(mAMediaCodec));
950}
951
952status_t AMediaCodecWrapper::flush() {
953 if (mAMediaCodec == NULL) {
954 return DEAD_OBJECT;
955 }
956 return translateErrorCode(AMediaCodec_flush(mAMediaCodec));
957}
958
959uint8_t* AMediaCodecWrapper::getInputBuffer(size_t idx, size_t *out_size) {
960 if (mAMediaCodec == NULL) {
961 return NULL;
962 }
963 return AMediaCodec_getInputBuffer(mAMediaCodec, idx, out_size);
964}
965
966uint8_t* AMediaCodecWrapper::getOutputBuffer(size_t idx, size_t *out_size) {
967 if (mAMediaCodec == NULL) {
968 return NULL;
969 }
970 return AMediaCodec_getOutputBuffer(mAMediaCodec, idx, out_size);
971}
972
973status_t AMediaCodecWrapper::queueInputBuffer(
974 size_t idx,
975 size_t offset,
976 size_t size,
977 uint64_t time,
978 uint32_t flags) {
979 if (mAMediaCodec == NULL) {
980 return DEAD_OBJECT;
981 }
982 return translateErrorCode(
983 AMediaCodec_queueInputBuffer(mAMediaCodec, idx, offset, size, time, flags));
984}
985
986status_t AMediaCodecWrapper::queueSecureInputBuffer(
987 size_t idx,
988 size_t offset,
989 sp<AMediaCodecCryptoInfoWrapper> &codecCryptoInfo,
990 uint64_t time,
991 uint32_t flags) {
992 if (mAMediaCodec == NULL) {
993 return DEAD_OBJECT;
994 }
995 return translateErrorCode(
996 AMediaCodec_queueSecureInputBuffer(
997 mAMediaCodec,
998 idx,
999 offset,
1000 codecCryptoInfo->getAMediaCodecCryptoInfo(),
1001 time,
1002 flags));
1003}
1004
1005sp<AMediaFormatWrapper> AMediaCodecWrapper::getOutputFormat() {
1006 if (mAMediaCodec == NULL) {
1007 return NULL;
1008 }
1009 return new AMediaFormatWrapper(AMediaCodec_getOutputFormat(mAMediaCodec));
1010}
1011
1012sp<AMediaFormatWrapper> AMediaCodecWrapper::getInputFormat() {
1013 if (mAMediaCodec == NULL) {
1014 return NULL;
1015 }
1016 return new AMediaFormatWrapper(AMediaCodec_getInputFormat(mAMediaCodec));
1017}
1018
1019status_t AMediaCodecWrapper::releaseOutputBuffer(size_t idx, bool render) {
1020 if (mAMediaCodec == NULL) {
1021 return DEAD_OBJECT;
1022 }
1023 return translateErrorCode(
1024 AMediaCodec_releaseOutputBuffer(mAMediaCodec, idx, render));
1025}
1026
Wei Jia28288fb2017-12-15 13:45:29 -08001027status_t AMediaCodecWrapper::setOutputSurface(const sp<ANativeWindowWrapper> &nww) {
Wei Jia53692fa2017-12-11 10:33:46 -08001028 if (mAMediaCodec == NULL) {
1029 return DEAD_OBJECT;
1030 }
1031 return translateErrorCode(
Wei Jia28288fb2017-12-15 13:45:29 -08001032 AMediaCodec_setOutputSurface(mAMediaCodec,
1033 (nww == NULL ? NULL : nww->getANativeWindow())));
Wei Jia53692fa2017-12-11 10:33:46 -08001034}
1035
1036status_t AMediaCodecWrapper::releaseOutputBufferAtTime(size_t idx, int64_t timestampNs) {
1037 if (mAMediaCodec == NULL) {
1038 return DEAD_OBJECT;
1039 }
1040 return translateErrorCode(
1041 AMediaCodec_releaseOutputBufferAtTime(mAMediaCodec, idx, timestampNs));
1042}
1043
1044status_t AMediaCodecWrapper::setParameters(const sp<AMediaFormatWrapper> &params) {
1045 if (mAMediaCodec == NULL) {
1046 return DEAD_OBJECT;
1047 }
1048 return translateErrorCode(
1049 AMediaCodec_setParameters(mAMediaCodec, params->getAMediaFormat()));
1050}
1051
Robert Shihff282cb2017-12-18 14:10:56 -08001052//////////// AMediaExtractorWrapper
1053
1054AMediaExtractorWrapper::AMediaExtractorWrapper(AMediaExtractor *aMediaExtractor)
1055 : mAMediaExtractor(aMediaExtractor) {
1056}
1057
1058AMediaExtractorWrapper::~AMediaExtractorWrapper() {
1059 release();
1060}
1061
1062status_t AMediaExtractorWrapper::release() {
1063 if (mAMediaExtractor != NULL) {
1064 media_status_t err = AMediaExtractor_delete(mAMediaExtractor);
1065 mAMediaExtractor = NULL;
1066 return translateErrorCode(err);
1067 }
1068 return OK;
1069}
1070
Robert Shih08eb9082018-03-09 13:57:26 -08001071status_t AMediaExtractorWrapper::disconnect() {
1072 if (mAMediaExtractor != NULL) {
1073 media_status_t err = AMediaExtractor_disconnect(mAMediaExtractor);
1074 return translateErrorCode(err);
1075 }
1076 return DEAD_OBJECT;
1077}
1078
Robert Shihff282cb2017-12-18 14:10:56 -08001079AMediaExtractor *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 Shihd4faf9e2018-01-21 17:52:25 -08001255ssize_t AMediaDataSourceWrapper::AMediaDataSourceWrapper_getSize(void *userdata) {
1256 DataSource *source = static_cast<DataSource *>(userdata);
1257 off64_t size = -1;
1258 source->getSize(&size);
1259 return size;
1260}
1261
1262ssize_t AMediaDataSourceWrapper::AMediaDataSourceWrapper_readAt(void *userdata, off64_t offset, void * buf, size_t size) {
1263 DataSource *source = static_cast<DataSource *>(userdata);
1264 return source->readAt(offset, buf, size);
1265}
1266
1267void AMediaDataSourceWrapper::AMediaDataSourceWrapper_close(void *userdata) {
1268 DataSource *source = static_cast<DataSource *>(userdata);
1269 source->close();
1270}
1271
1272AMediaDataSourceWrapper::AMediaDataSourceWrapper(const sp<DataSource> &dataSource)
1273 : mDataSource(dataSource),
1274 mAMediaDataSource(AMediaDataSource_new()) {
1275 ALOGV("setDataSource (source: %p)", dataSource.get());
1276 AMediaDataSource_setUserdata(mAMediaDataSource, dataSource.get());
1277 AMediaDataSource_setReadAt(mAMediaDataSource, AMediaDataSourceWrapper_readAt);
1278 AMediaDataSource_setGetSize(mAMediaDataSource, AMediaDataSourceWrapper_getSize);
1279 AMediaDataSource_setClose(mAMediaDataSource, AMediaDataSourceWrapper_close);
1280}
1281
1282AMediaDataSourceWrapper::~AMediaDataSourceWrapper() {
1283 if (mAMediaDataSource == NULL) {
1284 return;
1285 }
1286 AMediaDataSource_delete(mAMediaDataSource);
1287 mAMediaDataSource = NULL;
1288}
1289
1290AMediaDataSource* AMediaDataSourceWrapper::getAMediaDataSource() {
1291 return mAMediaDataSource;
1292}
1293
Wei Jia53692fa2017-12-11 10:33:46 -08001294} // namespace android