Get an AVFrame (if any)
| 1498 | |
| 1499 | // Get an AVFrame (if any) |
| 1500 | bool FFmpegReader::GetAVFrame() { |
| 1501 | int frameFinished = 0; |
| 1502 | auto note_hw_decode_failure = [&](int err, const char* stage) { |
| 1503 | #if USE_HW_ACCEL |
| 1504 | if (!hw_de_on || !hw_de_supported || force_sw_decode) { |
| 1505 | return; |
| 1506 | } |
| 1507 | if (err == AVERROR_INVALIDDATA && packet_status.video_decoded == 0) { |
| 1508 | hw_decode_error_count++; |
| 1509 | ZmqLogger::Instance()->AppendDebugMethod( |
| 1510 | std::string("FFmpegReader::GetAVFrame (hardware decode failure candidate during ") + stage + ")", |
| 1511 | "error_count", hw_decode_error_count, |
| 1512 | "error", err); |
| 1513 | if (hw_decode_error_count >= 3) { |
| 1514 | hw_decode_failed = true; |
| 1515 | } |
| 1516 | } |
| 1517 | #else |
| 1518 | (void) err; |
| 1519 | (void) stage; |
| 1520 | #endif |
| 1521 | }; |
| 1522 | |
| 1523 | // Decode video frame |
| 1524 | AVFrame *next_frame = AV_ALLOCATE_FRAME(); |
| 1525 | |
| 1526 | #if IS_FFMPEG_3_2 |
| 1527 | int send_packet_err = 0; |
| 1528 | int64_t send_packet_pts = 0; |
| 1529 | if ((packet && packet->stream_index == videoStream) || !packet) { |
| 1530 | send_packet_err = avcodec_send_packet(pCodecCtx, packet); |
| 1531 | |
| 1532 | if (packet && send_packet_err >= 0) { |
| 1533 | send_packet_pts = GetPacketPTS(); |
| 1534 | hold_packet = false; |
| 1535 | ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::GetAVFrame (send packet succeeded)", "send_packet_err", send_packet_err, "send_packet_pts", send_packet_pts); |
| 1536 | } |
| 1537 | } |
| 1538 | |
| 1539 | #if USE_HW_ACCEL |
| 1540 | // Get the format from the variables set in get_hw_dec_format |
| 1541 | hw_de_av_pix_fmt = hw_de_av_pix_fmt_global; |
| 1542 | hw_de_av_device_type = hw_de_av_device_type_global; |
| 1543 | #endif // USE_HW_ACCEL |
| 1544 | if (send_packet_err < 0 && send_packet_err != AVERROR_EOF) { |
| 1545 | ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::GetAVFrame (send packet: Not sent [" + av_err2string(send_packet_err) + "])", "send_packet_err", send_packet_err, "send_packet_pts", send_packet_pts); |
| 1546 | note_hw_decode_failure(send_packet_err, "send_packet"); |
| 1547 | if (send_packet_err == AVERROR(EAGAIN)) { |
| 1548 | hold_packet = true; |
| 1549 | ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::GetAVFrame (send packet: AVERROR(EAGAIN): user must read output with avcodec_receive_frame()", "send_packet_pts", send_packet_pts); |
| 1550 | } |
| 1551 | if (send_packet_err == AVERROR(EINVAL)) { |
| 1552 | ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::GetAVFrame (send packet: AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush", "send_packet_pts", send_packet_pts); |
| 1553 | } |
| 1554 | if (send_packet_err == AVERROR(ENOMEM)) { |
| 1555 | ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::GetAVFrame (send packet: AVERROR(ENOMEM): failed to add packet to internal queue, or legitimate decoding errors", "send_packet_pts", send_packet_pts); |
| 1556 | } |
| 1557 | } |
nothing calls this directly
no test coverage detected