| 556 | } |
| 557 | |
| 558 | int ff_hw_base_encode_receive_packet(FFHWBaseEncodeContext *ctx, |
| 559 | AVCodecContext *avctx, AVPacket *pkt) |
| 560 | { |
| 561 | FFHWBaseEncodePicture *pic = NULL; |
| 562 | AVFrame *frame = ctx->frame; |
| 563 | int err; |
| 564 | |
| 565 | av_assert0(ctx->op && ctx->op->init && ctx->op->issue && |
| 566 | ctx->op->output && ctx->op->free); |
| 567 | |
| 568 | start: |
| 569 | /** if no B frame before repeat P frame, sent repeat P frame out. */ |
| 570 | if (ctx->tail_pkt->size) { |
| 571 | for (FFHWBaseEncodePicture *tmp = ctx->pic_start; tmp; tmp = tmp->next) { |
| 572 | if (tmp->type == FF_HW_PICTURE_TYPE_B && tmp->pts < ctx->tail_pkt->pts) |
| 573 | break; |
| 574 | else if (!tmp->next) { |
| 575 | av_packet_move_ref(pkt, ctx->tail_pkt); |
| 576 | goto end; |
| 577 | } |
| 578 | } |
| 579 | } |
| 580 | |
| 581 | err = ff_encode_get_frame(avctx, frame); |
| 582 | if (err == AVERROR_EOF) { |
| 583 | frame = NULL; |
| 584 | } else if (err < 0) |
| 585 | return err; |
| 586 | |
| 587 | err = hw_base_encode_send_frame(avctx, ctx, frame); |
| 588 | if (err < 0) |
| 589 | return err; |
| 590 | |
| 591 | if (!ctx->pic_start) { |
| 592 | if (ctx->end_of_stream) |
| 593 | return AVERROR_EOF; |
| 594 | else |
| 595 | return AVERROR(EAGAIN); |
| 596 | } |
| 597 | |
| 598 | if (ctx->async_encode) { |
| 599 | if (av_fifo_can_write(ctx->encode_fifo)) { |
| 600 | err = hw_base_encode_pick_next(avctx, ctx, &pic); |
| 601 | if (!err) { |
| 602 | av_assert0(pic); |
| 603 | pic->encode_order = ctx->encode_order + |
| 604 | av_fifo_can_read(ctx->encode_fifo); |
| 605 | err = ctx->op->issue(avctx, pic); |
| 606 | if (err < 0) { |
| 607 | av_log(avctx, AV_LOG_ERROR, "Encode failed: %s.\n", av_err2str(err)); |
| 608 | return err; |
| 609 | } |
| 610 | pic->encode_issued = 1; |
| 611 | av_fifo_write(ctx->encode_fifo, &pic, 1); |
| 612 | } |
| 613 | } |
| 614 | |
| 615 | if (!av_fifo_can_read(ctx->encode_fifo)) |
no test coverage detected