We are using Android IMA sdk for ads playback. We followed the Basic example from IMA sdk to implement the ads use cases.
When we are playing preroll and repeatedly switching assets to play the next content, sometimes we see a crash as noted below.
12-17 18:09:01.492 1125 17435 E OMX-VDEC-1080P: eventfd_write failed for fd: -1, errno = 9, force stop async_thread
12-17 18:09:01.492 1125 17435 E OMX-VDEC-1080P: Invalid input: -1
12-17 18:09:01.492 1125 17435 I OMX-VDEC-1080P: Exit OMX vdec Destructor: fd=-1
12-17 18:09:01.493 1125 17435 E media.codec: Failed to allocate omx component 'OMX.qcom.video.decoder.avc' err=InsufficientResources(0x80001000)
12-17 18:09:01.498 1125 22131 I SoftAAC2: Reconfiguring decoder: 0->44100 Hz, 0->2 channels
12-17 18:09:01.499 19858 22134 E ACodec : Unable to instantiate codec 'OMX.qcom.video.decoder.avc' with err 0xfffffff4.
12-17 18:09:01.499 19858 22134 E ACodec : signalError(omxError 0xfffffff4, internalError -12)
12-17 18:09:01.502 1125 26870 E OMX-VDEC-1080P: Disabling C2D src_fmt = 2141391878 and dest_fmt = 2141391878
12-17 18:09:01.502 19858 22134 D IAtlas : IAtlas::init CallingPid 19858
12-17 18:09:01.502 1125 3187 E OMX-VDEC-1080P: Disabling C2D src_fmt = 2141391878 and dest_fmt = 2141391878
12-17 18:09:01.502 19858 22133 E MediaCodec: Codec reported err 0xfffffff4, actionCode 0, while in state 1
12-17 18:09:01.503 1125 3280 E OMXNodeInstance: getConfig(0xec755a44:qcom.decoder.avc, ??(0x7f000062)) ERROR: UnsupportedSetting(0x80001019)
12-17 18:09:01.503 19858 22134 D IAtlas : IAtlas::init this 0x70d97ea830
12-17 18:09:01.503 824 824 D AtlasService: setEvent what:256 val EventID,203,ClientPid,19858,ReportLevel,0,omxError,0xfffffff4,internalError,-12 : length 79
12-17 18:09:01.503 824 901 D AtlasService: handleMessage what:256 sValue EventID,203,ClientPid,19858,ReportLevel,0,omxError,0xfffffff4,internalError,-12
12-17 18:09:01.503 824 901 D AtlasService: cliensCount 1
12-17 18:09:01.503 824 901 D AtlasService: notify EVENT_DATA_FEEDBACK to client
12-17 18:09:01.504 3496 24328 D OppoAtlas_jni: JNIAtlasListener::notify msg 256 ext1 0 ext2 0
12-17 18:09:01.505 1113 5495 E ResourceManagerService: getLowestPriorityBiggestClient_l: lowest priority 0 vs caller priority 0
12-17 18:09:01.506 750 750 W AshmemAllocator: ashmem_create_region(32768) returning hidl_memory(0x73d342c100, 32768)
12-17 18:09:01.506 750 750 W AshmemAllocator: ashmem_create_region(32768) returning hidl_memory(0x73d342c100, 32768)
12-17 18:09:01.506 19858 22074 I MediaCodec: ~MediaCodec()
12-17 18:09:01.507 750 750 W AshmemAllocator: ashmem_create_region(32768) returning hidl_memory(0x73d342c100, 32768)
12-17 18:09:01.507 19858 22074 W MediaAnalyticsItem: Unable to record: [1:codec:0:-1::0:-1:1:0:2:android.media.mediacodec.codec=OMX.qcom.video.decoder.avc:android.media.mediacodec.mode=video:] [forcenew=0]
12-17 18:09:01.507 19858 22074 I ACodec : ~ACodec()
12-17 18:09:01.507 19858 22074 W MediaCodec-JNI: try to release MediaCodec from JMediaCodec::~JMediaCodec()...
12-17 18:09:01.507 750 750 W AshmemAllocator: ashmem_create_region(32768) returning hidl_memory(0x73d342c100, 32768)
12-17 18:09:01.510 19858 22074 W MediaCodec-JNI: done releasing MediaCodec from JMediaCodec::~JMediaCodec().
12-17 18:09:01.510 3496 24661 W ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.startService:1562 android.content.ContextWrapper.startService:675 oppo.util.OppoStatistics$1.run:102 java.util.concurrent.ThreadPoolExecutor.runWorker:1167 java.util.concurrent.ThreadPoolExecutor$Worker.run:641
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: Failed to initialize decoder: OMX.qcom.video.decoder.avc
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: android.media.MediaCodec$CodecException: Failed to initialize OMX.qcom.video.decoder.avc, error 0xfffffff4
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at android.media.MediaCodec.native_setup(Native Method)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at android.media.MediaCodec.<init>(MediaCodec.java:1811)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at android.media.MediaCodec.createByCodecName(MediaCodec.java:1792)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:802)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodecWithFallback(MediaCodecRenderer.java:745)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:474)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.reinitializeCodec(MediaCodecRenderer.java:1261)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1111)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:552)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:647)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:529)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:300)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at android.os.Handler.dispatchMessage(Handler.java:102)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at android.os.Looper.loop(Looper.java:226)
12-17 18:09:01.511 19858 22074 W MediaCodecRenderer: at android.os.HandlerThread.run(HandlerThread.java:65)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: Playback error.
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: com.google.android.exoplayer2.ExoPlaybackException: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.qcom.video.decoder.avc, Format(4, null, null, video/avc, avc1.4D4015, 716100, null, [576, 324, -1.0], [-1, -1])
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:479)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.reinitializeCodec(MediaCodecRenderer.java:1261)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1111)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:552)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:647)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:529)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:300)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at android.os.Handler.dispatchMessage(Handler.java:102)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at android.os.Looper.loop(Looper.java:226)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at android.os.HandlerThread.run(HandlerThread.java:65)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: Caused by: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.qcom.video.decoder.avc, Format(4, null, null, video/avc, avc1.4D4015, 716100, null, [576, 324, -1.0], [-1, -1])
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodecWithFallback(MediaCodecRenderer.java:753)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:474)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: ... 9 more
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: Caused by: android.media.MediaCodec$CodecException: Failed to initialize OMX.qcom.video.decoder.avc, error 0xfffffff4
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at android.media.MediaCodec.native_setup(Native Method)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at android.media.MediaCodec.<init>(MediaCodec.java:1811)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at android.media.MediaCodec.createByCodecName(MediaCodec.java:1792)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:802)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodecWithFallback(MediaCodecRenderer.java:745)
12-17 18:09:01.512 19858 22074 E ExoPlayerImplInternal: ... 10 more
12-17 18:09:01.513 19858 19858 D EventLogger: decoderDisabled [3.49, 0.00, window=0, period=0, video]
12-17 18:09:01.513 19858 22074 I MediaCodec: stop()
12-17 18:09:01.517 19858 22074 I MediaCodec: Audio release()
12-17 18:09:01.519 1125 25443 E OMX-VDEC-1080P: Disabling C2D src_fmt = 2141391878 and dest_fmt = 2141391878
12-17 18:09:01.519 1125 26870 E OMX-VDEC-1080P: Disabling C2D src_fmt = 2141391878 and dest_fmt = 2141391878
12-17 18:09:01.519 1125 3187 E OMX-VDEC-1080P: Extension: OMX.google.android.index.AndroidNativeBufferConsumerUsage not implemented
12-17 18:09:01.519 19858 22126 D SurfaceUtils: set up nativeWindow 0x70e5b83010 for 640x368, color 0x7fa30c06, rotation 0, usage 0x20002900
12-17 18:09:01.522 749 1821 D audio_hw_primary: adev_get_parameters:smartvolume.dump=
12-17 18:09:01.522 749 1821 D audio_hw_spkr_prot: audio_extn_fbsp_get_parameters: Speaker protection disabled
12-17 18:09:01.522 749 1821 D soundtrigger: audio_extn_sound_trigger_get_parameters input string<smartvolume.dump=>
12-17 18:09:01.522 749 1821 D soundtrigger: extract_sm_handle input string <smartvolume.dump=> param string <smartvolume.dump=>
12-17 18:09:01.522 749 1821 D audio_hw_extn: audio_extn_get_parameters: returns
12-17 18:09:01.522 749 1821 D audio_hw_primary: adev_get_parameters: exit: returns -
12-17 18:09:01.522 834 3071 I hash_map_utils: key: 'smartvolume.dump' value: ''
12-17 18:09:01.522 19858 22074 I MediaCodec: ~MediaCodec()
We are releasing the ads loader on every destroy using the below code
if (mAdsLoader !=null) {
mAdsLoader.removeAdErrorListener(this);
mAdsLoader.removeAdsLoadedListener(this);
mAdsLoader = null;
}
if (adDisplayContainer != null)
adDisplayContainer.destroy();
if (mAdsManager != null) {
mAdsManager.removeAdErrorListener(this);
mAdsManager.removeAdEventListener(this);
mAdsManager.destroy();
}
We are seeing this crash on certain phones like Oppo and Xiaomi. It looks like 1080P decoder is getting used to play Ads and for some reason its running out of resources when we switch assets while ads are playing.
Can someone help here to understand what exactly is going wrong and how to avoid it? Is the above code the correct way to clean ads module?
Thanks in advance.