+ int ret = 0;
+ /* make a copy if the input is not padded as libmfx requires */
+ AVFrame tmp_frame;
+ const AVFrame *src_frame;
+ int realigned = 0;
+
+
+ while (!s->session_upload_init && !s->session_upload && !ret) {
+#if HAVE_PTHREADS
+ if (pthread_mutex_trylock(&s->session_lock) == 0) {
+#endif
+ if (!s->session_upload_init) {
+ ret = qsv_init_internal_session(ctx, &s->session_upload, 1);
+ if (s->session_upload)
+ s->session_upload_init = 1;
+ }
+#if HAVE_PTHREADS
+ pthread_mutex_unlock(&s->session_lock);
+ pthread_cond_signal(&s->session_cond);
+ } else {
+ pthread_mutex_lock(&s->session_lock);
+ while (!s->session_upload_init && !s->session_upload) {
+ pthread_cond_wait(&s->session_cond, &s->session_lock);
+ }
+ pthread_mutex_unlock(&s->session_lock);
+ }
+#endif
+ }
+ if (ret < 0)
+ return ret;
+
+ if (src->height & 15 || src->linesize[0] & 15) {
+ realigned = 1;
+ memset(&tmp_frame, 0, sizeof(tmp_frame));
+ tmp_frame.format = src->format;
+ tmp_frame.width = FFALIGN(src->width, 16);
+ tmp_frame.height = FFALIGN(src->height, 16);
+ ret = av_frame_get_buffer(&tmp_frame, 0);
+ if (ret < 0)
+ return ret;
+
+ ret = av_frame_copy(&tmp_frame, src);
+ if (ret < 0) {
+ av_frame_unref(&tmp_frame);
+ return ret;
+ }
+ }
+
+ src_frame = realigned ? &tmp_frame : src;