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