| 317 | } |
| 318 | |
| 319 | static int discard_samples(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples) |
| 320 | { |
| 321 | AVCodecInternal *avci = avctx->internal; |
| 322 | AVFrameSideData *side; |
| 323 | uint32_t discard_padding = 0; |
| 324 | uint8_t skip_reason = 0; |
| 325 | uint8_t discard_reason = 0; |
| 326 | |
| 327 | side = av_frame_get_side_data(frame, AV_FRAME_DATA_SKIP_SAMPLES); |
| 328 | if (side && side->size >= 10) { |
| 329 | avci->skip_samples = AV_RL32(side->data); |
| 330 | avci->skip_samples = FFMAX(0, avci->skip_samples); |
| 331 | discard_padding = AV_RL32(side->data + 4); |
| 332 | av_log(avctx, AV_LOG_DEBUG, "skip %d / discard %d samples due to side data\n", |
| 333 | avci->skip_samples, (int)discard_padding); |
| 334 | skip_reason = AV_RL8(side->data + 8); |
| 335 | discard_reason = AV_RL8(side->data + 9); |
| 336 | } |
| 337 | |
| 338 | if ((avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) { |
| 339 | if (!side && (avci->skip_samples || discard_padding)) |
| 340 | side = av_frame_new_side_data(frame, AV_FRAME_DATA_SKIP_SAMPLES, 10); |
| 341 | if (side && (avci->skip_samples || discard_padding)) { |
| 342 | AV_WL32(side->data, avci->skip_samples); |
| 343 | AV_WL32(side->data + 4, discard_padding); |
| 344 | AV_WL8(side->data + 8, skip_reason); |
| 345 | AV_WL8(side->data + 9, discard_reason); |
| 346 | avci->skip_samples = 0; |
| 347 | } |
| 348 | return 0; |
| 349 | } |
| 350 | av_frame_remove_side_data(frame, AV_FRAME_DATA_SKIP_SAMPLES); |
| 351 | |
| 352 | if ((frame->flags & AV_FRAME_FLAG_DISCARD)) { |
| 353 | avci->skip_samples = FFMAX(0, avci->skip_samples - frame->nb_samples); |
| 354 | *discarded_samples += frame->nb_samples; |
| 355 | return AVERROR(EAGAIN); |
| 356 | } |
| 357 | |
| 358 | if (avci->skip_samples > 0) { |
| 359 | if (frame->nb_samples <= avci->skip_samples){ |
| 360 | *discarded_samples += frame->nb_samples; |
| 361 | avci->skip_samples -= frame->nb_samples; |
| 362 | av_log(avctx, AV_LOG_DEBUG, "skip whole frame, skip left: %d\n", |
| 363 | avci->skip_samples); |
| 364 | return AVERROR(EAGAIN); |
| 365 | } else { |
| 366 | av_samples_copy(frame->extended_data, frame->extended_data, 0, avci->skip_samples, |
| 367 | frame->nb_samples - avci->skip_samples, avctx->ch_layout.nb_channels, frame->format); |
| 368 | if (avctx->pkt_timebase.num && avctx->sample_rate) { |
| 369 | int64_t diff_ts = av_rescale_q(avci->skip_samples, |
| 370 | (AVRational){1, avctx->sample_rate}, |
| 371 | avctx->pkt_timebase); |
| 372 | if (frame->pts != AV_NOPTS_VALUE) |
| 373 | frame->pts += diff_ts; |
| 374 | if (frame->pkt_dts != AV_NOPTS_VALUE) |
| 375 | frame->pkt_dts += diff_ts; |
| 376 | if (frame->duration >= diff_ts) |
no test coverage detected