Re: [FFmpeg-devel] [PATCH] avcodec/videotoolboxenc: fix encoding frame crash on iOS 11
We have tested on iOS 12 and other version. Only on iOS 11 this crash occurs, regardless using which device such as iPhone 8, iPhone X or iPhone 7. Aman Gupta 于2019年9月4日周三 上午7:48写道: > > > > On Mon, Aug 12, 2019 at 11:50 PM sharpbai wrote: >> >> On iOS 11, encoding a frame may return error with log >> "Error encoding frame 0", which means vtenc_output_callback >> is called with status=0 and sample_buffer=NULL. Then the >> encoding session will be crashed on next callback wether or not >> closing the codec context. >> >> Let us look through the link below introducing VTCompressionOutputCallback, >> >> https://developer.apple.com/documentation/videotoolbox/vtcompressionoutputcallback?language=objc >> >> "status=0" (noErr) means compression was successful. >> "sampleBuffer=NULL" means the frame was dropped when compression >> was successful (status=0) or compression was not successful (status!=0). >> >> So we should not set AVERROR_EXTERNAL on "status=0" and "sample_buffer=NULL" >> as it is not a error. >> >> The fix is that we only set AVERROR_EXTERNAL with status value non zero. >> When sample_buffer is NULL and status value is zero, we simply return >> with no other operation. >> >> This crash often occurs on iOS 11 for example encoding 720p@25fps. > > > Is it fixed in iOS 12, or untested there? > >> >> >> Signed-off-by: sharpbai >> --- >> libavcodec/videotoolboxenc.c | 6 +- >> 1 file changed, 5 insertions(+), 1 deletion(-) >> >> diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c >> index d76bb7f646..8afdd125d2 100644 >> --- a/libavcodec/videotoolboxenc.c >> +++ b/libavcodec/videotoolboxenc.c >> @@ -569,12 +569,16 @@ static void vtenc_output_callback( >> return; >> } >> >> -if (status || !sample_buffer) { >> +if (status) { >> av_log(avctx, AV_LOG_ERROR, "Error encoding frame: %d\n", >> (int)status); >> set_async_error(vtctx, AVERROR_EXTERNAL); >> return; >> } >> >> +if (!sample_buffer) { >> +return; >> +} >> + >> if (!avctx->extradata && (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)) { >> int set_status = set_extradata(avctx, sample_buffer); >> if (set_status) { >> -- >> 2.21.0 >> >> ___ >> 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". -- Regards, Sharpbai Focus on web programming. Blog - https://blog.sharpbai.com/ ___ 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".
Re: [FFmpeg-devel] [PATCH] Notify user when encode a CBR mp3 file without "-write_xing false". This may result in mp3 file duration incorect on ios safari browser and webview. I try to fix it but it c
ios safari browser support the xing header, and the duration of the mp3 file with xing header is correct. But with "Info" replaced "Xing" in xing header in CBR mode, ios safari browser does not skip the first frame and using the first frame header(the bitrate in header has changed to enlarge frame size as xing frame needs at least 177 bytes) to calculate duration. 2017-04-23 0:29 GMT+08:00 Michael Niedermayer : > On Fri, Apr 21, 2017 at 10:59:41PM +0800, sharp...@gmail.com wrote: >> From: sharpbai >> >> Bug example: >> >> ffmpeg -i a.mp3 -c:a mp3 -ab 32k -ar 44100 -ac 1 b.mp3 >> >> The duration of the generated file b.mp3 is wrong on ios safari browser from >> ios7 to ios10. >> --- >> libavformat/mp3enc.c | 7 ++- >> 1 file changed, 6 insertions(+), 1 deletion(-) > > ios safari browser doesnt support the xing header ? > > [...] > > -- > Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB > > Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope > > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > -- Regards, Sharpbai Focus on web programming. Blog - http://blog.tbai.me/ Weibo - http://weibo.com/iambaitian Renren - http://renren.com/sharpbai ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] [PATCH] avdevice/avfoundation: add scaleFactor attribute for avfoundation
Thank you for your patient. I will follow your direction. Question 1: Your patch misses to cover the scale factor in case of a device name string given by the user. The problem in mac os the screen to be catpured in avfoundation not have a real name. Only video device in avfoundation has a name. The screen name "Capture screen [n]" you have seen through "-list_devices" is given by ffmpeg developer for convinent. So there is a possibility that someone may build a capture device which name is the same as "Capture screen 0" which may result in capturing wrong device. So using "-list_devices" to find out the screen index then assign it should be the only right way. Question 2: Although Apple's reference says it works for scale_factor > 1.0, it should be documented (at least in the code) that it seems not to actually do anything for scale_factor > 1.0. This is a tough problem. I spent 5 days to prepare an available test environment which is almost done yesterday. My test environment covers the following operating systems: - Mac OS X 10.7.5 - Mac OS X 10.8.5 - Mac OS X 10.8.5 - Mac OS X 10.10.5 - Mac OS X 10.11.5 - mac OS 10.12.6 I have confirmed that on 10.7 and 10.8 the value of scale_factor can be larger than 1.0(scale_factor = 10.0 works. scale_factor = 20.0, the ffmpeg using 2.4GB memory and freezing), the maximum value is unknown but i think is infinate :) I have compared the images which scale_factor range from 1.0 to 4.0 captured in 10.8, the images which scale_factor greater than 1.0 are not clearer than 1.0. They are simply scaled larger. From 10.9 and later, the value of scale_factor is limited to maximum 1.0. I think Apple had recognized that the value larger than 1.0 is not useful. So I think the scale_factor range should be 0.0 to 1.0. The value greater than 1.0 can be done through ffmpeg scale filter or any other way. 2017-08-07 23:22 GMT+08:00 Thilo Borgmann : > Am 07.08.17 um 01:31 schrieb sharpbai: >> From: sharpbai >> >> feature: add scaleFactor attribute for avfoundation >> added by: siyuan.w...@duobei.com >> added by: yiren...@duobei.com >> --- >> doc/indevs.texi| 22 ++ >> libavdevice/avfoundation.m | 6 ++ >> 2 files changed, 28 insertions(+) >> >> diff --git a/doc/indevs.texi b/doc/indevs.texi >> index 09e3321..1ba71d7 100644 >> --- a/doc/indevs.texi >> +++ b/doc/indevs.texi >> @@ -139,6 +139,13 @@ Capture the mouse pointer. Default is 0. >> @item -capture_mouse_clicks >> Capture the screen mouse clicks. Default is 0. >> >> +@item -scale_factor >> +Scale factor for capture the screen. Set this property to scale the buffers > "Scale factor during screen capturing. Set this property to scale the screens > by a given factor." > > >> +by a given factor. For example capturing a retina screen which resolution >> 2880x1800 > Trailing whitespace. > > >> +with a scale_factor of 0.5 (or 0.05) produces video buffers at 1440x900 (or >> 144x90). > The example part should cover that so this can be removed. > > >> +This is useful for reducing captured file size and increasing performance >> +in capturing screen. > Can also be removed. > > >> Default is 1.0 (no scaling). >> + >> @end table >> >> @subsection Examples >> @@ -169,6 +176,21 @@ Record video from the system default video device using >> the pixel format bgr0 an >> $ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi >> @end example >> >> +@item >> +Capture video from the first screen using the pixel format bgr0 and scaling >> in half size into out.avi. >> +First command use the avfoundation device command to enumerate all the >> available input devices including >> +screens ready to be captured: >> +@example >> +$ ffmpeg -f avfoundation -list_devices true -i "" >> +@end example >> +Once you've figured out the device index corresponding to the screen to be >> captured use, run the second >> +command with the correct screen device index to execute screen capture. > The documentation already covers the block above so this should be removed. > > >> For example on my mac the index >> +of "Screen Capture 0" is "1", I should replace @code{-i >> ""} with @code{-i "1"} in the second command. >> +@example >> +$ ffmpeg -f avfoundation -pixel_format bgr0 -scale_factor 0.5 -i >> "" out.avi >> +@end example >> + >> + > Remove things like "on my mac" and "I should...". > See the other examples for reference. > > >> @end itemize >> >> @section bktr >> diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m >> index e2ddf47..1196cf3 100644 >> --- a/libavdevice/avfoundation.m >> +++ b/libavdevice/avfoundation.m >> @@ -96,6 +96,7 @@ typedef struct >> >> int capture_cursor; >> int capture_mouse_clicks; >> +float scale_factor; >> >> int list_devices; >> int video_device_index; >> @@ -735,6 +736,10 @@ static int avf_read_header(AVFormatContext *s) >> capture_screen_input.mi