Lines Matching refs:pic

42                                            VAAPIEncodePicture *pic,
55 tmp = av_realloc_array(pic->param_buffers, sizeof(*tmp), pic->nb_param_buffers + 2);
58 pic->param_buffers = tmp;
69 pic->param_buffers[pic->nb_param_buffers++] = param_buffer;
80 pic->param_buffers[pic->nb_param_buffers++] = data_buffer;
88 VAAPIEncodePicture *pic,
96 tmp = av_realloc_array(pic->param_buffers, sizeof(*tmp), pic->nb_param_buffers + 1);
99 pic->param_buffers = tmp;
108 pic->param_buffers[pic->nb_param_buffers++] = buffer;
116 VAAPIEncodePicture *pic,
133 return vaapi_encode_make_param_buffer(avctx, pic,
139 VAAPIEncodePicture *pic)
144 av_assert0(pic->encode_issued);
146 if (pic->encode_complete) {
151 av_log(avctx, AV_LOG_DEBUG, "Sync to pic %"PRId64"/%"PRId64" "
152 "(input surface %#x).\n", pic->display_order,
153 pic->encode_order, pic->input_surface);
158 pic->output_buffer,
168 vas = vaSyncSurface(ctx->hwctx->display, pic->input_surface);
177 av_frame_free(&pic->input_image);
179 pic->encode_complete = 1;
184 VAAPIEncodePicture *pic)
190 for (i = 0; i < pic->nb_slices; i++)
191 pic->slices[i].row_size = ctx->slice_size;
196 av_assert0(rounding < pic->nb_slices);
202 ++pic->slices[i].row_size;
205 ++pic->slices[pic->nb_slices - i - 1].row_size;
207 ++pic->slices[i].row_size;
212 pic->slices[pic->nb_slices - 1].row_size += rounding;
215 for (i = 0; i < pic->nb_slices; i++) {
216 slice = &pic->slices[i];
222 const VAAPIEncodeSlice *prev = &pic->slices[i - 1];
239 VAAPIEncodePicture *pic)
248 slice = &pic->slices[index];
251 pic->slices[index].block_start = ctx->col_bd[i] +
253 pic->slices[index].block_size = ctx->row_height[j] * ctx->col_width[i];
266 VAAPIEncodePicture *pic)
276 av_log(avctx, AV_LOG_DEBUG, "Issuing encode for pic %"PRId64"/%"PRId64" "
277 "as type %s.\n", pic->display_order, pic->encode_order,
278 picture_type_name[pic->type]);
279 if (pic->nb_refs == 0) {
283 for (i = 0; i < pic->nb_refs; i++) {
285 pic->refs[i]->display_order, pic->refs[i]->encode_order);
290 av_assert0(!pic->encode_issued);
291 for (i = 0; i < pic->nb_refs; i++) {
292 av_assert0(pic->refs[i]);
293 av_assert0(pic->refs[i]->encode_issued);
296 av_log(avctx, AV_LOG_DEBUG, "Input surface is %#x.\n", pic->input_surface);
298 pic->recon_image = av_frame_alloc();
299 if (!pic->recon_image) {
304 err = av_hwframe_get_buffer(ctx->recon_frames_ref, pic->recon_image, 0);
309 pic->recon_surface = (VASurfaceID)(uintptr_t)pic->recon_image->data[3];
310 av_log(avctx, AV_LOG_DEBUG, "Recon surface is %#x.\n", pic->recon_surface);
312 pic->output_buffer_ref = av_buffer_pool_get(ctx->output_buffer_pool);
313 if (!pic->output_buffer_ref) {
317 pic->output_buffer = (VABufferID)(uintptr_t)pic->output_buffer_ref->data;
319 pic->output_buffer);
322 pic->codec_picture_params = av_malloc(ctx->codec->picture_params_size);
323 if (!pic->codec_picture_params)
325 memcpy(pic->codec_picture_params, ctx->codec_picture_params,
331 pic->nb_param_buffers = 0;
333 if (pic->type == PICTURE_TYPE_IDR && ctx->codec->init_sequence_params) {
334 err = vaapi_encode_make_param_buffer(avctx, pic,
342 if (pic->type == PICTURE_TYPE_IDR) {
344 err = vaapi_encode_make_misc_param_buffer(avctx, pic,
354 err = ctx->codec->init_picture_params(avctx, pic);
360 err = vaapi_encode_make_param_buffer(avctx, pic,
362 pic->codec_picture_params,
370 err = vaapi_encode_make_misc_param_buffer(avctx, pic,
379 if (pic->type == PICTURE_TYPE_IDR) {
389 err = vaapi_encode_make_packed_header(avctx, pic,
400 err = ctx->codec->write_picture_header(avctx, pic, data, &bit_len);
406 err = vaapi_encode_make_packed_header(avctx, pic,
417 err = ctx->codec->write_extra_buffer(avctx, pic, i, &type,
427 err = vaapi_encode_make_param_buffer(avctx, pic, type,
439 err = ctx->codec->write_extra_header(avctx, pic, i, &type,
449 err = vaapi_encode_make_packed_header(avctx, pic, type,
456 if (pic->nb_slices == 0)
457 pic->nb_slices = ctx->nb_slices;
458 if (pic->nb_slices > 0) {
459 pic->slices = av_calloc(pic->nb_slices, sizeof(*pic->slices));
460 if (!pic->slices) {
466 vaapi_encode_make_tile_slice(avctx, pic);
468 vaapi_encode_make_row_slice(avctx, pic);
471 for (i = 0; i < pic->nb_slices; i++) {
472 slice = &pic->slices[i];
483 err = ctx->codec->init_slice_params(avctx, pic, slice);
494 err = ctx->codec->write_slice_header(avctx, pic, slice,
501 err = vaapi_encode_make_packed_header(avctx, pic,
509 err = vaapi_encode_make_param_buffer(avctx, pic,
519 sd = av_frame_get_side_data(pic->input_image,
541 pic->roi = av_calloc(nb_roi, sizeof(*pic->roi));
542 if (!pic->roi) {
555 pic->roi[i] = (VAEncROI) {
570 .roi = pic->roi,
574 err = vaapi_encode_make_misc_param_buffer(avctx, pic,
584 pic->input_surface);
593 pic->param_buffers, pic->nb_param_buffers);
617 for (i = 0; i < pic->nb_param_buffers; i++) {
619 pic->param_buffers[i]);
623 pic->param_buffers[i], vas, vaErrorStr(vas));
629 pic->encode_issued = 1;
636 for(i = 0; i < pic->nb_param_buffers; i++)
637 vaDestroyBuffer(ctx->hwctx->display, pic->param_buffers[i]);
638 if (pic->slices) {
639 for (i = 0; i < pic->nb_slices; i++)
640 av_freep(&pic->slices[i].codec_slice_params);
643 av_freep(&pic->codec_picture_params);
644 av_freep(&pic->param_buffers);
645 av_freep(&pic->slices);
646 av_freep(&pic->roi);
647 av_frame_free(&pic->recon_image);
648 av_buffer_unref(&pic->output_buffer_ref);
649 pic->output_buffer = VA_INVALID_ID;
654 VAAPIEncodePicture *pic, AVPacket *pkt)
663 err = vaapi_encode_wait(avctx, pic);
668 vas = vaMapBuffer(ctx->hwctx->display, pic->output_buffer,
694 if (pic->type == PICTURE_TYPE_IDR)
697 pkt->pts = pic->pts;
699 vas = vaUnmapBuffer(ctx->hwctx->display, pic->output_buffer);
707 av_buffer_unref(&pic->output_buffer_ref);
708 pic->output_buffer = VA_INVALID_ID;
710 av_log(avctx, AV_LOG_DEBUG, "Output read for pic %"PRId64"/%"PRId64".\n",
711 pic->display_order, pic->encode_order);
715 vaUnmapBuffer(ctx->hwctx->display, pic->output_buffer);
717 av_buffer_unref(&pic->output_buffer_ref);
718 pic->output_buffer = VA_INVALID_ID;
723 VAAPIEncodePicture *pic)
725 vaapi_encode_wait(avctx, pic);
727 if (pic->output_buffer_ref) {
728 av_log(avctx, AV_LOG_DEBUG, "Discard output for pic "
730 pic->display_order, pic->encode_order);
732 av_buffer_unref(&pic->output_buffer_ref);
733 pic->output_buffer = VA_INVALID_ID;
742 VAAPIEncodePicture *pic;
744 pic = av_mallocz(sizeof(*pic));
745 if (!pic)
749 pic->priv_data = av_mallocz(ctx->codec->picture_priv_data_size);
750 if (!pic->priv_data) {
751 av_freep(&pic);
756 pic->input_surface = VA_INVALID_ID;
757 pic->recon_surface = VA_INVALID_ID;
758 pic->output_buffer = VA_INVALID_ID;
760 return pic;
764 VAAPIEncodePicture *pic)
768 if (pic->encode_issued)
769 vaapi_encode_discard(avctx, pic);
771 if (pic->slices) {
772 for (i = 0; i < pic->nb_slices; i++)
773 av_freep(&pic->slices[i].codec_slice_params);
775 av_freep(&pic->codec_picture_params);
777 av_frame_free(&pic->input_image);
778 av_frame_free(&pic->recon_image);
780 av_freep(&pic->param_buffers);
781 av_freep(&pic->slices);
783 av_assert0(pic->output_buffer == VA_INVALID_ID);
785 av_freep(&pic->priv_data);
786 av_freep(&pic->codec_picture_params);
787 av_freep(&pic->roi);
789 av_free(pic);
795 VAAPIEncodePicture *pic,
802 av_assert0(pic != target);
803 av_assert0(pic->nb_refs < MAX_PICTURE_REFERENCES);
804 pic->refs[pic->nb_refs++] = target;
809 av_assert0(pic->nb_dpb_pics < MAX_DPB_SIZE);
810 pic->dpb[pic->nb_dpb_pics++] = target;
815 av_assert0(!pic->prev);
816 pic->prev = target;
825 VAAPIEncodePicture *pic,
830 if (pic->ref_removed[level])
833 for (i = 0; i < pic->nb_refs; i++) {
834 av_assert0(pic->refs[i]);
835 --pic->refs[i]->ref_count[level];
836 av_assert0(pic->refs[i]->ref_count[level] >= 0);
839 for (i = 0; i < pic->nb_dpb_pics; i++) {
840 av_assert0(pic->dpb[i]);
841 --pic->dpb[i]->ref_count[level];
842 av_assert0(pic->dpb[i]->ref_count[level] >= 0);
845 av_assert0(pic->prev || pic->type == PICTURE_TYPE_IDR);
846 if (pic->prev) {
847 --pic->prev->ref_count[level];
848 av_assert0(pic->prev->ref_count[level] >= 0);
851 pic->ref_removed[level] = 1;
862 VAAPIEncodePicture *pic, *next, *ref;
871 for (pic = start->next; pic; pic = pic->next) {
872 if (pic == end)
874 pic->type = PICTURE_TYPE_B;
875 pic->b_depth = current_depth;
877 vaapi_encode_add_ref(avctx, pic, start, 1, 1, 0);
878 vaapi_encode_add_ref(avctx, pic, end, 1, 1, 0);
879 vaapi_encode_add_ref(avctx, pic, prev, 0, 0, 1);
882 vaapi_encode_add_ref(avctx, pic, ref, 0, 1, 0);
890 for (pic = start->next; pic != end; pic = pic->next)
892 for (pic = start->next, i = 1; 2 * i < len; pic = pic->next, i++);
894 pic->type = PICTURE_TYPE_B;
895 pic->b_depth = current_depth;
897 pic->is_reference = 1;
899 vaapi_encode_add_ref(avctx, pic, pic, 0, 1, 0);
900 vaapi_encode_add_ref(avctx, pic, start, 1, 1, 0);
901 vaapi_encode_add_ref(avctx, pic, end, 1, 1, 0);
902 vaapi_encode_add_ref(avctx, pic, prev, 0, 0, 1);
905 vaapi_encode_add_ref(avctx, pic, ref, 0, 1, 0);
908 vaapi_encode_set_b_pictures(avctx, start, pic, pic,
911 next = pic;
913 vaapi_encode_set_b_pictures(avctx, pic, end, next,
922 VAAPIEncodePicture *pic = NULL, *next, *start;
928 for (pic = ctx->pic_start; pic; pic = pic->next) {
929 if (pic->encode_issued)
931 if (pic->type != PICTURE_TYPE_B)
933 for (i = 0; i < pic->nb_refs; i++) {
934 if (!pic->refs[i]->encode_issued)
937 if (i == pic->nb_refs)
941 if (pic) {
943 "encode next.\n", pic->b_depth);
944 *pic_out = pic;
954 for (pic = ctx->pic_start; pic; pic = next) {
955 next = pic->next;
956 if (pic->encode_issued) {
957 start = pic;
962 if (pic->force_idr)
978 if (!pic && ctx->end_of_stream) {
980 pic = ctx->pic_end;
981 if (pic->encode_complete)
983 else if (pic->encode_issued)
987 if (!pic) {
998 if (pic->force_idr) {
1001 pic->type = PICTURE_TYPE_IDR;
1009 pic->type = PICTURE_TYPE_IDR;
1014 pic->type = PICTURE_TYPE_I;
1027 pic->type = PICTURE_TYPE_P;
1031 pic->is_reference = 1;
1032 *pic_out = pic;
1034 vaapi_encode_add_ref(avctx, pic, pic, 0, 1, 0);
1035 if (pic->type != PICTURE_TYPE_IDR) {
1036 vaapi_encode_add_ref(avctx, pic, start,
1037 pic->type == PICTURE_TYPE_P,
1039 vaapi_encode_add_ref(avctx, pic, ctx->next_prev, 0, 0, 1);
1045 vaapi_encode_set_b_pictures(avctx, start, pic, pic, 1,
1048 ctx->next_prev = pic;
1057 VAAPIEncodePicture *pic, *prev, *next;
1062 for (pic = ctx->pic_start; pic; pic = pic->next) {
1063 if (pic->encode_complete && pic->next)
1064 vaapi_encode_remove_refs(avctx, pic, 0);
1068 for (pic = ctx->pic_start; pic; pic = pic->next) {
1069 if (pic->encode_complete && pic->ref_count[0] == 0)
1070 vaapi_encode_remove_refs(avctx, pic, 1);
1075 for (pic = ctx->pic_start; pic; pic = next) {
1076 next = pic->next;
1077 if (pic->encode_complete && pic->ref_count[1] == 0) {
1078 av_assert0(pic->ref_removed[0] && pic->ref_removed[1]);
1083 vaapi_encode_free(avctx, pic);
1085 prev = pic;
1121 VAAPIEncodePicture *pic;
1132 pic = vaapi_encode_alloc(avctx);
1133 if (!pic)
1136 pic->input_image = av_frame_alloc();
1137 if (!pic->input_image) {
1143 pic->force_idr = 1;
1145 pic->input_surface = (VASurfaceID)(uintptr_t)frame->data[3];
1146 pic->pts = frame->pts;
1148 av_frame_move_ref(pic->input_image, frame);
1151 ctx->first_pts = pic->pts;
1153 ctx->dts_pts_diff = pic->pts - ctx->first_pts;
1156 (3 * ctx->output_delay + ctx->async_depth)] = pic->pts;
1158 pic->display_order = ctx->input_order;
1162 ctx->pic_end->next = pic;
1163 ctx->pic_end = pic;
1165 ctx->pic_start = pic;
1166 ctx->pic_end = pic;
1181 vaapi_encode_free(avctx, pic);
1188 VAAPIEncodePicture *pic;
1211 pic = NULL;
1214 err = vaapi_encode_pick_next(avctx, &pic);
1216 av_assert0(pic);
1217 pic->encode_order = ctx->encode_order +
1219 err = vaapi_encode_issue(avctx, pic);
1224 av_fifo_write(ctx->encode_fifo, &pic, 1);
1235 av_fifo_read(ctx->encode_fifo, &pic, 1);
1236 ctx->encode_order = pic->encode_order + 1;
1238 pic = NULL;
1239 err = vaapi_encode_pick_next(avctx, &pic);
1242 av_assert0(pic);
1244 pic->encode_order = ctx->encode_order++;
1246 err = vaapi_encode_issue(avctx, pic);
1253 err = vaapi_encode_output(avctx, pic, pkt);
1261 } else if (pic->encode_order < ctx->decode_delay) {
1262 if (ctx->ts_ring[pic->encode_order] < INT64_MIN + ctx->dts_pts_diff)
1265 pkt->dts = ctx->ts_ring[pic->encode_order] - ctx->dts_pts_diff;
1267 pkt->dts = ctx->ts_ring[(pic->encode_order - ctx->decode_delay) %
1273 ctx->output_order = pic->encode_order;
2742 VAAPIEncodePicture *pic, *next;
2749 for (pic = ctx->pic_start; pic; pic = next) {
2750 next = pic->next;
2751 vaapi_encode_free(avctx, pic);