On 5/30/2019 11:16 PM, Sun, Jing A wrote: > -----Original Message----- > From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On Behalf Of > James Almer > Sent: Thursday, May 30, 2019 11:35 PM > To: ffmpeg-devel@ffmpeg.org > Subject: Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc > encoder wrapper > >> Why the switch to encode2? All previous versions were using the send/receive >> API, and seeing SVT also uses a decoupled input/output API, it was certainly >> the most adequate option. >> Were you running into some issue? A quick look at v12 shows you were using >> ff_alloc_packet2(), which afaik you shouldn't have. It's meant for the >> encode2() API only, where user provided buffers are allowed, and it alone >> does not ensure the packet will be reference counted, which is required for >> the send/receive API. > > Hi James, > > Yes I indeed was running into an issue. Although SVT uses a decoupled > input/output API, it calls the two by the below method: > while(not stopped) { > send_frame(one frame); > if (receive_packet(one frame’s pkt) != empty) > save_bitstream; > } > In one round, none or only one packet is receive. > > However, if using v12's send_frame/receive_packet implementation, it is > possible that multiple of receive_packet are executed in one round. > while(not stopped) { > send_frame(one frame); > while(1) { > if (receive_packet(one frame’s pkt) == empty) > break; > else > save_bitstream; > } > } > > The first calling method's sequence is like: > Send 579 > Receive 487 > Send 580 > Receive 496 > Send 581 > Receive 492 > Send 582 > Receive 490 > Send 583 > Receive 489 > Send 584 > Receive 491 > Send 585 > Receive 494 > Send 586 > Receive 493 > Send 587 > Receive 495 > And the second one's is: > Send 579 > Receive empty > Send 580 > Receive 489 > Receive 491 > Receive 494 > Receive 493 > Receive 495 > Receive empty > Send 581 > Receive 504 > Receive empty > Send 582 > Receive empty > Send 583 > Receive empty > Send 584 > Receive 500 > Receive empty > Send 585 > Receive empty > Send 586 > Receive empty > Send 587 > > When we input the source frame at the constant frequency 60, the first one's > each second's output frames are ~60, [59, 61], while the second one's tends > to be like 64(63) ->57(58) ->64(63) ->57(58)… > Besides the average FPS, the stableness of each second's FPS is also > important to us. So I changed the API to encode2, because in encode2, I can > control the SVT's send_frame/receive_packet calling sequence, and let it not > do receive_packet more than once in one round.
Yes, i can reproduce what you describe with the ffmpeg.c CLI, where avcodec_receive_frame is called in a while(1) loop until it returns EAGAIN after each avcodec_send_frame call. In the end it depends on how an API user implements avcodec_send_frame/avcodec_receive_frame, but using the encode2 API for this purpose is ok. > > And thanks for the information on ff_alloc_packet2. I changed to use > av_new_packet in v13 and hope it's OK. No, with the encode2 API you should be using ff_alloc_packet2() instead. As i said, the API user may provide it's own buffer in the avpacket passed to avcodec_encode_video2(), which av_new_packet() would ignore and unconditionally allocate a new one. > > Regards, > Sun, Jing > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".