mfxBitstream *bs;
mfxFrameSurface1 *surf = NULL;
- mfxSyncPoint sync = NULL;
- mfxSyncPoint *sync = NULL;
++ mfxSyncPoint *sync = NULL;
+ QSVFrame *qsv_frame = NULL;
+ mfxEncodeCtrl* enc_ctrl = NULL;
int ret;
if (frame) {
bs->Data = new_pkt.data;
bs->MaxLength = new_pkt.size;
+ if (q->set_encode_ctrl_cb) {
+ q->set_encode_ctrl_cb(avctx, frame, &qsv_frame->enc_ctrl);
+ }
+
+ sync = av_mallocz(sizeof(*sync));
+ if (!sync) {
+ av_freep(&bs);
+ av_packet_unref(&new_pkt);
+ return AVERROR(ENOMEM);
+ }
+
do {
- ret = MFXVideoENCODE_EncodeFrameAsync(q->session, enc_ctrl, surf, bs, &sync);
- ret = MFXVideoENCODE_EncodeFrameAsync(q->session, NULL, surf, bs, sync);
- if (ret == MFX_WRN_DEVICE_BUSY)
- av_usleep(1);
- } while (ret > 0);
++ ret = MFXVideoENCODE_EncodeFrameAsync(q->session, enc_ctrl, surf, bs, sync);
+ if (ret == MFX_WRN_DEVICE_BUSY) {
+ av_usleep(500);
+ continue;
+ }
+ break;
+ } while ( 1 );
if (ret < 0) {
av_packet_unref(&new_pkt);