| 37 | } |
| 38 | |
| 39 | static int vaapi_mpeg2_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size) |
| 40 | { |
| 41 | struct MpegEncContext * const s = avctx->priv_data; |
| 42 | struct vaapi_context * const vactx = avctx->hwaccel_context; |
| 43 | VAPictureParameterBufferMPEG2 *pic_param; |
| 44 | VAIQMatrixBufferMPEG2 *iq_matrix; |
| 45 | int i; |
| 46 | |
| 47 | dprintf(avctx, "vaapi_mpeg2_start_frame()\n"); |
| 48 | |
| 49 | vactx->slice_param_size = sizeof(VASliceParameterBufferMPEG2); |
| 50 | |
| 51 | /* Fill in VAPictureParameterBufferMPEG2 */ |
| 52 | pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferMPEG2)); |
| 53 | if (!pic_param) |
| 54 | return -1; |
| 55 | pic_param->horizontal_size = s->width; |
| 56 | pic_param->vertical_size = s->height; |
| 57 | pic_param->forward_reference_picture = VA_INVALID_ID; |
| 58 | pic_param->backward_reference_picture = VA_INVALID_ID; |
| 59 | pic_param->picture_coding_type = s->pict_type; |
| 60 | pic_param->f_code = mpeg2_get_f_code(s); |
| 61 | pic_param->picture_coding_extension.value = 0; /* reset all bits */ |
| 62 | pic_param->picture_coding_extension.bits.intra_dc_precision = s->intra_dc_precision; |
| 63 | pic_param->picture_coding_extension.bits.picture_structure = s->picture_structure; |
| 64 | pic_param->picture_coding_extension.bits.top_field_first = s->top_field_first; |
| 65 | pic_param->picture_coding_extension.bits.frame_pred_frame_dct = s->frame_pred_frame_dct; |
| 66 | pic_param->picture_coding_extension.bits.concealment_motion_vectors = s->concealment_motion_vectors; |
| 67 | pic_param->picture_coding_extension.bits.q_scale_type = s->q_scale_type; |
| 68 | pic_param->picture_coding_extension.bits.intra_vlc_format = s->intra_vlc_format; |
| 69 | pic_param->picture_coding_extension.bits.alternate_scan = s->alternate_scan; |
| 70 | pic_param->picture_coding_extension.bits.repeat_first_field = s->repeat_first_field; |
| 71 | pic_param->picture_coding_extension.bits.progressive_frame = s->progressive_frame; |
| 72 | pic_param->picture_coding_extension.bits.is_first_field = mpeg2_get_is_frame_start(s); |
| 73 | |
| 74 | switch (s->pict_type) { |
| 75 | case FF_B_TYPE: |
| 76 | pic_param->backward_reference_picture = ff_vaapi_get_surface_id(&s->next_picture); |
| 77 | // fall-through |
| 78 | case FF_P_TYPE: |
| 79 | pic_param->forward_reference_picture = ff_vaapi_get_surface_id(&s->last_picture); |
| 80 | break; |
| 81 | } |
| 82 | |
| 83 | /* Fill in VAIQMatrixBufferMPEG2 */ |
| 84 | iq_matrix = ff_vaapi_alloc_iq_matrix(vactx, sizeof(VAIQMatrixBufferMPEG2)); |
| 85 | if (!iq_matrix) |
| 86 | return -1; |
| 87 | iq_matrix->load_intra_quantiser_matrix = 1; |
| 88 | iq_matrix->load_non_intra_quantiser_matrix = 1; |
| 89 | iq_matrix->load_chroma_intra_quantiser_matrix = 1; |
| 90 | iq_matrix->load_chroma_non_intra_quantiser_matrix = 1; |
| 91 | |
| 92 | for (i = 0; i < 64; i++) { |
| 93 | int n = s->dsp.idct_permutation[ff_zigzag_direct[i]]; |
| 94 | iq_matrix->intra_quantiser_matrix[i] = s->intra_matrix[n]; |
| 95 | iq_matrix->non_intra_quantiser_matrix[i] = s->inter_matrix[n]; |
| 96 | iq_matrix->chroma_intra_quantiser_matrix[i] = s->chroma_intra_matrix[n]; |
nothing calls this directly
no test coverage detected