| 430 | |
| 431 | #if CONFIG_LIBKLVANC |
| 432 | static void construct_cc(AVFormatContext *avctx, struct decklink_ctx *ctx, |
| 433 | AVPacket *pkt, struct klvanc_line_set_s *vanc_lines) |
| 434 | { |
| 435 | struct klvanc_packet_eia_708b_s *cdp; |
| 436 | uint16_t *cdp_words; |
| 437 | uint16_t len; |
| 438 | uint8_t cc_count; |
| 439 | size_t size; |
| 440 | int ret, i; |
| 441 | |
| 442 | const uint8_t *data = av_packet_get_side_data(pkt, AV_PKT_DATA_A53_CC, &size); |
| 443 | if (!data) |
| 444 | return; |
| 445 | |
| 446 | cc_count = size / 3; |
| 447 | |
| 448 | ret = klvanc_create_eia708_cdp(&cdp); |
| 449 | if (ret) |
| 450 | return; |
| 451 | |
| 452 | ret = klvanc_set_framerate_EIA_708B(cdp, ctx->bmd_tb_num, ctx->bmd_tb_den); |
| 453 | if (ret) { |
| 454 | av_log(avctx, AV_LOG_ERROR, "Invalid framerate specified: %" PRId64 "/%" PRId64 "\n", |
| 455 | ctx->bmd_tb_num, ctx->bmd_tb_den); |
| 456 | klvanc_destroy_eia708_cdp(cdp); |
| 457 | return; |
| 458 | } |
| 459 | |
| 460 | if (cc_count > KLVANC_MAX_CC_COUNT) { |
| 461 | av_log(avctx, AV_LOG_ERROR, "Illegal cc_count received: %d\n", cc_count); |
| 462 | cc_count = KLVANC_MAX_CC_COUNT; |
| 463 | } |
| 464 | |
| 465 | /* CC data */ |
| 466 | cdp->header.ccdata_present = 1; |
| 467 | cdp->header.caption_service_active = 1; |
| 468 | cdp->ccdata.cc_count = cc_count; |
| 469 | for (i = 0; i < cc_count; i++) { |
| 470 | if (data [3*i] & 0x04) |
| 471 | cdp->ccdata.cc[i].cc_valid = 1; |
| 472 | cdp->ccdata.cc[i].cc_type = data[3*i] & 0x03; |
| 473 | cdp->ccdata.cc[i].cc_data[0] = data[3*i+1]; |
| 474 | cdp->ccdata.cc[i].cc_data[1] = data[3*i+2]; |
| 475 | } |
| 476 | |
| 477 | klvanc_finalize_EIA_708B(cdp, ctx->cdp_sequence_num++); |
| 478 | ret = klvanc_convert_EIA_708B_to_words(cdp, &cdp_words, &len); |
| 479 | klvanc_destroy_eia708_cdp(cdp); |
| 480 | if (ret != 0) { |
| 481 | av_log(avctx, AV_LOG_ERROR, "Failed converting 708 packet to words\n"); |
| 482 | return; |
| 483 | } |
| 484 | |
| 485 | ret = klvanc_line_insert(ctx->vanc_ctx, vanc_lines, cdp_words, len, 11, 0); |
| 486 | free(cdp_words); |
| 487 | if (ret != 0) { |
| 488 | av_log(avctx, AV_LOG_ERROR, "VANC line insertion failed\n"); |
| 489 | return; |
no test coverage detected