| 980 | } |
| 981 | |
| 982 | int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len, |
| 983 | void **data, size_t *sei_size) |
| 984 | { |
| 985 | AVFrameSideData *sd = NULL; |
| 986 | uint8_t *sei_data; |
| 987 | PutBitContext pb; |
| 988 | uint32_t *tc; |
| 989 | int m; |
| 990 | |
| 991 | if (frame) |
| 992 | sd = av_frame_get_side_data(frame, AV_FRAME_DATA_S12M_TIMECODE); |
| 993 | |
| 994 | if (!sd) { |
| 995 | *data = NULL; |
| 996 | return 0; |
| 997 | } |
| 998 | tc = (uint32_t*)sd->data; |
| 999 | m = tc[0] & 3; |
| 1000 | |
| 1001 | *sei_size = sizeof(uint32_t) * 4; |
| 1002 | *data = av_mallocz(*sei_size + prefix_len); |
| 1003 | if (!*data) |
| 1004 | return AVERROR(ENOMEM); |
| 1005 | sei_data = (uint8_t*)*data + prefix_len; |
| 1006 | |
| 1007 | init_put_bits(&pb, sei_data, *sei_size); |
| 1008 | put_bits(&pb, 2, m); // num_clock_ts |
| 1009 | |
| 1010 | for (int j = 1; j <= m; j++) { |
| 1011 | unsigned hh, mm, ss, ff, drop; |
| 1012 | ff_timecode_set_smpte(&drop, &hh, &mm, &ss, &ff, rate, tc[j], 0, 0); |
| 1013 | |
| 1014 | put_bits(&pb, 1, 1); // clock_timestamp_flag |
| 1015 | put_bits(&pb, 1, 1); // units_field_based_flag |
| 1016 | put_bits(&pb, 5, 0); // counting_type |
| 1017 | put_bits(&pb, 1, 1); // full_timestamp_flag |
| 1018 | put_bits(&pb, 1, 0); // discontinuity_flag |
| 1019 | put_bits(&pb, 1, drop); |
| 1020 | put_bits(&pb, 9, ff); |
| 1021 | put_bits(&pb, 6, ss); |
| 1022 | put_bits(&pb, 6, mm); |
| 1023 | put_bits(&pb, 5, hh); |
| 1024 | put_bits(&pb, 5, 0); |
| 1025 | } |
| 1026 | flush_put_bits(&pb); |
| 1027 | |
| 1028 | return 0; |
| 1029 | } |
| 1030 | |
| 1031 | int64_t ff_guess_coded_bitrate(AVCodecContext *avctx) |
| 1032 | { |
no test coverage detected