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