static SDL_AMediaCodecBufferProxy *SDL_VoutAndroid_obtainBufferProxy_l(SDL_Vout *vout, int acodec_serial, int buffer_index) { SDL_Vout_Opaque *opaque = vout->opaque; SDL_AMediaCodecBufferProxy *proxy = NULL; if (ISDL_Array__size(&opaque->overlay_pool) > 0) { proxy = ISDL_Array__pop_back(&opaque->overlay_pool); SDL_AMediaCodecBufferProxy_reset(proxy); } else { proxy = (SDL_AMediaCodecBufferProxy *)mallocz(sizeof(SDL_AMediaCodecBufferProxy)); if (!proxy) return NULL; SDL_AMediaCodecBufferProxy_init(proxy); ISDL_Array__push_back(&opaque->overlay_manager, proxy); } proxy->buffer_id = opaque->next_buffer_id++; proxy->acodec_serial = acodec_serial; proxy->buffer_index = buffer_index; AMCTRACE("%s: [%d] ++++++++ proxy %d: vout: %d idx: %d", __func__, proxy->buffer_id, proxy->acodec_serial, SDL_AMediaCodec_getSerial(opaque->acodec), proxy->buffer_index); return proxy; }
static SDL_AMediaCodecBufferProxy *SDL_VoutAndroid_obtainBufferProxy_l(SDL_Vout *vout, int acodec_serial, int buffer_index, SDL_AMediaCodecBufferInfo *buffer_info) { SDL_Vout_Opaque *opaque = vout->opaque; SDL_AMediaCodecBufferProxy *proxy = NULL; if (ISDL_Array__size(&opaque->overlay_pool) > 0) { proxy = ISDL_Array__pop_back(&opaque->overlay_pool); SDL_AMediaCodecBufferProxy_reset(proxy); } else { proxy = (SDL_AMediaCodecBufferProxy *)mallocz(sizeof(SDL_AMediaCodecBufferProxy)); if (!proxy) return NULL; SDL_AMediaCodecBufferProxy_init(proxy); ISDL_Array__push_back(&opaque->overlay_manager, proxy); } proxy->buffer_id = opaque->next_buffer_id++; proxy->acodec_serial = acodec_serial; proxy->buffer_index = buffer_index; proxy->buffer_info = *buffer_info; AMCTRACE("%s: [%d] ++++++++ proxy %d: vout: %d idx: %d fake: %s", __func__, proxy->buffer_id, proxy->acodec_serial, SDL_AMediaCodec_getSerial(opaque->acodec), proxy->buffer_index, (proxy->buffer_info.flags & AMEDIACODEC__BUFFER_FLAG_FAKE_FRAME) ? "YES" : "NO"); return proxy; }
static int SDL_VoutAndroid_releaseBufferProxy_l(SDL_Vout *vout, SDL_AMediaCodecBufferProxy *proxy, bool render) { SDL_Vout_Opaque *opaque = vout->opaque; if (!proxy) return 0; AMCTRACE("%s: [%d] -------- proxy %d: vout: %d idx: %d render: %s fake: %s", __func__, proxy->buffer_id, proxy->acodec_serial, SDL_AMediaCodec_getSerial(opaque->acodec), proxy->buffer_index, render ? "true" : "false", (proxy->buffer_info.flags & AMEDIACODEC__BUFFER_FLAG_FAKE_FRAME) ? "YES" : "NO"); ISDL_Array__push_back(&opaque->overlay_pool, proxy); if (!SDL_AMediaCodec_isSameSerial(opaque->acodec, proxy->acodec_serial)) { ALOGW("%s: [%d] ???????? proxy %d: vout: %d idx: %d render: %s fake: %s", __func__, proxy->buffer_id, proxy->acodec_serial, SDL_AMediaCodec_getSerial(opaque->acodec), proxy->buffer_index, render ? "true" : "false", (proxy->buffer_info.flags & AMEDIACODEC__BUFFER_FLAG_FAKE_FRAME) ? "YES" : "NO"); return 0; } if (proxy->buffer_index < 0) { ALOGE("%s: [%d] invalid AMediaCodec buffer index %d\n", __func__, proxy->buffer_id, proxy->buffer_index); return 0; } else if (proxy->buffer_info.flags & AMEDIACODEC__BUFFER_FLAG_FAKE_FRAME) { proxy->buffer_index = -1; return 0; } sdl_amedia_status_t amc_ret = SDL_AMediaCodec_releaseOutputBuffer(opaque->acodec, proxy->buffer_index, render); if (amc_ret != SDL_AMEDIA_OK) { ALOGW("%s: [%d] !!!!!!!! proxy %d: vout: %d idx: %d render: %s, fake: %s", __func__, proxy->buffer_id, proxy->acodec_serial, SDL_AMediaCodec_getSerial(opaque->acodec), proxy->buffer_index, render ? "true" : "false", (proxy->buffer_info.flags & AMEDIACODEC__BUFFER_FLAG_FAKE_FRAME) ? "YES" : "NO"); proxy->buffer_index = -1; return -1; } proxy->buffer_index = -1; return 0; }