+ if (p->itut_t35) {
+ GetByteContext gb;
+ unsigned int user_identifier;
+
+ bytestream2_init(&gb, p->itut_t35->payload, p->itut_t35->payload_size);
+ bytestream2_skip(&gb, 1); // terminal provider code
+ bytestream2_skip(&gb, 1); // terminal provider oriented code
+ user_identifier = bytestream2_get_be32(&gb);
+ switch (user_identifier) {
+ case MKBETAG('G', 'A', '9', '4'): { // closed captions
+ AVBufferRef *buf = NULL;
+
+ res = ff_parse_a53_cc(&buf, gb.buffer, bytestream2_get_bytes_left(&gb));
+ if (res < 0)
+ goto fail;
+ if (!res)
+ break;
+
+ if (!av_frame_new_side_data_from_buf(frame, AV_FRAME_DATA_A53_CC, buf))
+ av_buffer_unref(&buf);
+
+ c->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
+ break;
+ }
+ default: // ignore unsupported identifiers
+ break;
+ }
+ }
+ if (p->frame_hdr->film_grain.present && (!dav1d->apply_grain ||
+ (c->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN))) {
+ AVFilmGrainParams *fgp = av_film_grain_params_create_side_data(frame);
+ if (!fgp) {
+ res = AVERROR(ENOMEM);
+ goto fail;
+ }
+
+ fgp->type = AV_FILM_GRAIN_PARAMS_AV1;
+ fgp->seed = p->frame_hdr->film_grain.data.seed;
+ fgp->codec.aom.num_y_points = p->frame_hdr->film_grain.data.num_y_points;
+ fgp->codec.aom.chroma_scaling_from_luma = p->frame_hdr->film_grain.data.chroma_scaling_from_luma;
+ fgp->codec.aom.scaling_shift = p->frame_hdr->film_grain.data.scaling_shift;
+ fgp->codec.aom.ar_coeff_lag = p->frame_hdr->film_grain.data.ar_coeff_lag;
+ fgp->codec.aom.ar_coeff_shift = p->frame_hdr->film_grain.data.ar_coeff_shift;
+ fgp->codec.aom.grain_scale_shift = p->frame_hdr->film_grain.data.grain_scale_shift;
+ fgp->codec.aom.overlap_flag = p->frame_hdr->film_grain.data.overlap_flag;
+ fgp->codec.aom.limit_output_range = p->frame_hdr->film_grain.data.clip_to_restricted_range;
+
+ memcpy(&fgp->codec.aom.y_points, &p->frame_hdr->film_grain.data.y_points,
+ sizeof(fgp->codec.aom.y_points));
+ memcpy(&fgp->codec.aom.num_uv_points, &p->frame_hdr->film_grain.data.num_uv_points,
+ sizeof(fgp->codec.aom.num_uv_points));
+ memcpy(&fgp->codec.aom.uv_points, &p->frame_hdr->film_grain.data.uv_points,
+ sizeof(fgp->codec.aom.uv_points));
+ memcpy(&fgp->codec.aom.ar_coeffs_y, &p->frame_hdr->film_grain.data.ar_coeffs_y,
+ sizeof(fgp->codec.aom.ar_coeffs_y));
+ memcpy(&fgp->codec.aom.ar_coeffs_uv[0], &p->frame_hdr->film_grain.data.ar_coeffs_uv[0],
+ sizeof(fgp->codec.aom.ar_coeffs_uv[0]));
+ memcpy(&fgp->codec.aom.ar_coeffs_uv[1], &p->frame_hdr->film_grain.data.ar_coeffs_uv[1],
+ sizeof(fgp->codec.aom.ar_coeffs_uv[1]));
+ memcpy(&fgp->codec.aom.uv_mult, &p->frame_hdr->film_grain.data.uv_mult,
+ sizeof(fgp->codec.aom.uv_mult));
+ memcpy(&fgp->codec.aom.uv_mult_luma, &p->frame_hdr->film_grain.data.uv_luma_mult,
+ sizeof(fgp->codec.aom.uv_mult_luma));
+ memcpy(&fgp->codec.aom.uv_offset, &p->frame_hdr->film_grain.data.uv_offset,
+ sizeof(fgp->codec.aom.uv_offset));
+ }