MCPcopy Create free account
hub / github.com/OpenShot/libopenshot / GetAVFrame

Method GetAVFrame

src/FFmpegReader.cpp:1500–1732  ·  view source on GitHub ↗

Get an AVFrame (if any)

Source from the content-addressed store, hash-verified

1498
1499// Get an AVFrame (if any)
1500bool 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 }

Callers

nothing calls this directly

Calls 3

av_err2stringFunction · 0.85
OutOfMemoryClass · 0.85
AppendDebugMethodMethod · 0.80

Tested by

no test coverage detected