fix ios ffprobe implementation

This commit is contained in:
Taner Sener 2021-09-15 21:26:32 +01:00
parent e3ea69a58e
commit 28612fce75
6 changed files with 45 additions and 45 deletions

View File

@ -103,7 +103,7 @@ volatile int handleSIGXCPU = 1;
volatile int handleSIGPIPE = 1; volatile int handleSIGPIPE = 1;
/** Holds the id of the current session */ /** Holds the id of the current session */
__thread volatile long sessionId = 0; __thread volatile long globalSessionId = 0;
/** Holds the default log level */ /** Holds the default log level */
int configuredLogLevel = AV_LOG_INFO; int configuredLogLevel = AV_LOG_INFO;
@ -275,7 +275,7 @@ void logCallbackDataAdd(int level, AVBPrint *data) {
// CREATE DATA STRUCT FIRST // CREATE DATA STRUCT FIRST
struct CallbackData *newData = (struct CallbackData*)av_malloc(sizeof(struct CallbackData)); struct CallbackData *newData = (struct CallbackData*)av_malloc(sizeof(struct CallbackData));
newData->type = LogType; newData->type = LogType;
newData->sessionId = sessionId; newData->sessionId = globalSessionId;
newData->logLevel = level; newData->logLevel = level;
av_bprint_init(&newData->logData, 0, AV_BPRINT_SIZE_UNLIMITED); av_bprint_init(&newData->logData, 0, AV_BPRINT_SIZE_UNLIMITED);
av_bprintf(&newData->logData, "%s", data->str); av_bprintf(&newData->logData, "%s", data->str);
@ -303,7 +303,7 @@ void logCallbackDataAdd(int level, AVBPrint *data) {
monitorNotify(); monitorNotify();
atomic_fetch_add(&sessionInTransitMessageCountMap[sessionId % SESSION_MAP_SIZE], 1); atomic_fetch_add(&sessionInTransitMessageCountMap[globalSessionId % SESSION_MAP_SIZE], 1);
} }
/** /**
@ -314,7 +314,7 @@ void statisticsCallbackDataAdd(int frameNumber, float fps, float quality, int64_
// CREATE DATA STRUCT FIRST // CREATE DATA STRUCT FIRST
struct CallbackData *newData = (struct CallbackData*)av_malloc(sizeof(struct CallbackData)); struct CallbackData *newData = (struct CallbackData*)av_malloc(sizeof(struct CallbackData));
newData->type = StatisticsType; newData->type = StatisticsType;
newData->sessionId = sessionId; newData->sessionId = globalSessionId;
newData->statisticsFrameNumber = frameNumber; newData->statisticsFrameNumber = frameNumber;
newData->statisticsFps = fps; newData->statisticsFps = fps;
newData->statisticsQuality = quality; newData->statisticsQuality = quality;
@ -347,7 +347,7 @@ void statisticsCallbackDataAdd(int frameNumber, float fps, float quality, int64_
monitorNotify(); monitorNotify();
atomic_fetch_add(&sessionInTransitMessageCountMap[sessionId % SESSION_MAP_SIZE], 1); atomic_fetch_add(&sessionInTransitMessageCountMap[globalSessionId % SESSION_MAP_SIZE], 1);
} }
/** /**
@ -787,10 +787,10 @@ JNIEXPORT jint JNICALL Java_com_arthenica_ffmpegkit_FFmpegKitConfig_nativeFFmpeg
} }
// REGISTER THE ID BEFORE STARTING THE SESSION // REGISTER THE ID BEFORE STARTING THE SESSION
sessionId = (long) id; globalSessionId = (long) id;
addSession((long) id); addSession((long) id);
resetMessagesInTransmit(sessionId); resetMessagesInTransmit(globalSessionId);
// RUN // RUN
int returnCode = ffmpeg_execute(argumentCount, argv); int returnCode = ffmpeg_execute(argumentCount, argv);

View File

@ -30,10 +30,10 @@
int ffprobe_execute(int argc, char **argv); int ffprobe_execute(int argc, char **argv);
extern int configuredLogLevel; extern int configuredLogLevel;
extern __thread volatile long sessionId; extern __thread volatile long globalSessionId;
extern void addSession(long id); extern void addSession(long sessionId);
extern void removeSession(long id); extern void removeSession(long sessionId);
extern void resetMessagesInTransmit(long id); extern void resetMessagesInTransmit(long sessionId);
/** /**
* Synchronously executes FFprobe natively with arguments provided. * Synchronously executes FFprobe natively with arguments provided.
@ -78,10 +78,10 @@ JNIEXPORT jint JNICALL Java_com_arthenica_ffmpegkit_FFmpegKitConfig_nativeFFprob
} }
// REGISTER THE ID BEFORE STARTING THE SESSION // REGISTER THE ID BEFORE STARTING THE SESSION
sessionId = (long) id; globalSessionId = (long) id;
addSession((long) id); addSession((long) id);
resetMessagesInTransmit(sessionId); resetMessagesInTransmit(globalSessionId);
// RUN // RUN
int returnCode = ffprobe_execute(argumentCount, argv); int returnCode = ffprobe_execute(argumentCount, argv);

View File

@ -260,9 +260,9 @@ extern volatile int handleSIGTERM;
extern volatile int handleSIGXCPU; extern volatile int handleSIGXCPU;
extern volatile int handleSIGPIPE; extern volatile int handleSIGPIPE;
extern __thread volatile long sessionId; extern __thread volatile long globalSessionId;
extern void cancelSession(long id); extern void cancelSession(long sessionId);
extern int cancelRequested(long id); extern int cancelRequested(long sessionId);
/* sub2video hack: /* sub2video hack:
Convert subtitles to video with alpha to insert them in filter graphs. Convert subtitles to video with alpha to insert them in filter graphs.
@ -772,7 +772,7 @@ static void ffmpeg_cleanup(int ret)
if (received_sigterm) { if (received_sigterm) {
av_log(NULL, AV_LOG_INFO, "Exiting normally, received signal %d.\n", av_log(NULL, AV_LOG_INFO, "Exiting normally, received signal %d.\n",
(int) received_sigterm); (int) received_sigterm);
} else if (cancelRequested(sessionId)) { } else if (cancelRequested(globalSessionId)) {
av_log(NULL, AV_LOG_INFO, "Exiting normally, received cancel request.\n"); av_log(NULL, AV_LOG_INFO, "Exiting normally, received cancel request.\n");
} else if (ret && atomic_load(&transcode_init_done)) { } else if (ret && atomic_load(&transcode_init_done)) {
av_log(NULL, AV_LOG_INFO, "Conversion failed!\n"); av_log(NULL, AV_LOG_INFO, "Conversion failed!\n");
@ -2438,7 +2438,7 @@ static int ifilter_send_eof(InputFilter *ifilter, int64_t pts)
if (ifilter->filter) { if (ifilter->filter) {
/* THIS VALIDATION IS REQUIRED TO COMPLETE CANCELLATION */ /* THIS VALIDATION IS REQUIRED TO COMPLETE CANCELLATION */
if (!received_sigterm && !cancelRequested(sessionId)) { if (!received_sigterm && !cancelRequested(globalSessionId)) {
ret = av_buffersrc_close(ifilter->filter, pts, AV_BUFFERSRC_FLAG_PUSH); ret = av_buffersrc_close(ifilter->filter, pts, AV_BUFFERSRC_FLAG_PUSH);
} }
if (ret < 0) if (ret < 0)
@ -4989,7 +4989,7 @@ static int transcode(void)
goto fail; goto fail;
#endif #endif
while (!received_sigterm && !cancelRequested(sessionId)) { while (!received_sigterm && !cancelRequested(globalSessionId)) {
int64_t cur_time= av_gettime_relative(); int64_t cur_time= av_gettime_relative();
/* if 'q' pressed, exits */ /* if 'q' pressed, exits */
@ -5728,10 +5728,10 @@ int ffmpeg_execute(int argc, char **argv)
if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1]) if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1])
exit_program(69); exit_program(69);
exit_program((received_nb_signals || cancelRequested(sessionId))? 255 : main_ffmpeg_return_code); exit_program((received_nb_signals || cancelRequested(globalSessionId))? 255 : main_ffmpeg_return_code);
} else { } else {
main_ffmpeg_return_code = (received_nb_signals || cancelRequested(sessionId)) ? 255 : longjmp_value; main_ffmpeg_return_code = (received_nb_signals || cancelRequested(globalSessionId)) ? 255 : longjmp_value;
} }
return main_ffmpeg_return_code; return main_ffmpeg_return_code;

View File

@ -85,7 +85,7 @@ volatile int handleSIGXCPU = 1;
volatile int handleSIGPIPE = 1; volatile int handleSIGPIPE = 1;
/** Holds the id of the current execution */ /** Holds the id of the current execution */
__thread volatile long _sessionId = 0; __thread volatile long globalSessionId = 0;
/** Holds the default log level */ /** Holds the default log level */
int configuredLogLevel = LevelAVLogInfo; int configuredLogLevel = LevelAVLogInfo;
@ -254,7 +254,7 @@ void callbackNotify() {
* @param logData log data * @param logData log data
*/ */
void logCallbackDataAdd(int level, NSString *logData) { void logCallbackDataAdd(int level, NSString *logData) {
CallbackData* callbackData = [[CallbackData alloc] init:_sessionId logLevel:level data:logData]; CallbackData* callbackData = [[CallbackData alloc] init:globalSessionId logLevel:level data:logData];
[lock lock]; [lock lock];
[callbackDataArray addObject:callbackData]; [callbackDataArray addObject:callbackData];
@ -262,14 +262,14 @@ void logCallbackDataAdd(int level, NSString *logData) {
callbackNotify(); callbackNotify();
atomic_fetch_add(&sessionInTransitMessageCountMap[_sessionId % SESSION_MAP_SIZE], 1); atomic_fetch_add(&sessionInTransitMessageCountMap[globalSessionId % SESSION_MAP_SIZE], 1);
} }
/** /**
* Adds statistics data to the end of callback data list. * Adds statistics data to the end of callback data list.
*/ */
void statisticsCallbackDataAdd(int frameNumber, float fps, float quality, int64_t size, int time, double bitrate, double speed) { void statisticsCallbackDataAdd(int frameNumber, float fps, float quality, int64_t size, int time, double bitrate, double speed) {
CallbackData *callbackData = [[CallbackData alloc] init:_sessionId videoFrameNumber:frameNumber fps:fps quality:quality size:size time:time bitrate:bitrate speed:speed]; CallbackData *callbackData = [[CallbackData alloc] init:globalSessionId videoFrameNumber:frameNumber fps:fps quality:quality size:size time:time bitrate:bitrate speed:speed];
[lock lock]; [lock lock];
[callbackDataArray addObject:callbackData]; [callbackDataArray addObject:callbackData];
@ -277,7 +277,7 @@ void statisticsCallbackDataAdd(int frameNumber, float fps, float quality, int64_
callbackNotify(); callbackNotify();
atomic_fetch_add(&sessionInTransitMessageCountMap[_sessionId % SESSION_MAP_SIZE], 1); atomic_fetch_add(&sessionInTransitMessageCountMap[globalSessionId % SESSION_MAP_SIZE], 1);
} }
/** /**
@ -581,7 +581,7 @@ int executeFFmpeg(long sessionId, NSArray* arguments) {
} }
// REGISTER THE ID BEFORE STARTING THE SESSION // REGISTER THE ID BEFORE STARTING THE SESSION
_sessionId = sessionId; globalSessionId = sessionId;
registerSessionId(sessionId); registerSessionId(sessionId);
resetMessagesInTransmit(sessionId); resetMessagesInTransmit(sessionId);
@ -621,7 +621,7 @@ int executeFFprobe(long sessionId, NSArray* arguments) {
} }
// REGISTER THE ID BEFORE STARTING THE SESSION // REGISTER THE ID BEFORE STARTING THE SESSION
_sessionId = sessionId; globalSessionId = sessionId;
registerSessionId(sessionId); registerSessionId(sessionId);
resetMessagesInTransmit(sessionId); resetMessagesInTransmit(sessionId);

View File

@ -257,9 +257,9 @@ extern volatile int handleSIGTERM;
extern volatile int handleSIGXCPU; extern volatile int handleSIGXCPU;
extern volatile int handleSIGPIPE; extern volatile int handleSIGPIPE;
extern __thread volatile long sessionId; extern __thread volatile long globalSessionId;
extern void cancelSession(long id); extern void cancelSession(long sessionId);
extern int cancelRequested(long id); extern int cancelRequested(long sessionId);
/* sub2video hack: /* sub2video hack:
Convert subtitles to video with alpha to insert them in filter graphs. Convert subtitles to video with alpha to insert them in filter graphs.
@ -769,7 +769,7 @@ static void ffmpeg_cleanup(int ret)
if (received_sigterm) { if (received_sigterm) {
av_log(NULL, AV_LOG_INFO, "Exiting normally, received signal %d.\n", av_log(NULL, AV_LOG_INFO, "Exiting normally, received signal %d.\n",
(int) received_sigterm); (int) received_sigterm);
} else if (cancelRequested(sessionId)) { } else if (cancelRequested(globalSessionId)) {
av_log(NULL, AV_LOG_INFO, "Exiting normally, received cancel request.\n"); av_log(NULL, AV_LOG_INFO, "Exiting normally, received cancel request.\n");
} else if (ret && atomic_load(&transcode_init_done)) { } else if (ret && atomic_load(&transcode_init_done)) {
av_log(NULL, AV_LOG_INFO, "Conversion failed!\n"); av_log(NULL, AV_LOG_INFO, "Conversion failed!\n");
@ -2435,7 +2435,7 @@ static int ifilter_send_eof(InputFilter *ifilter, int64_t pts)
if (ifilter->filter) { if (ifilter->filter) {
/* THIS VALIDATION IS REQUIRED TO COMPLETE CANCELLATION */ /* THIS VALIDATION IS REQUIRED TO COMPLETE CANCELLATION */
if (!received_sigterm && !cancelRequested(sessionId)) { if (!received_sigterm && !cancelRequested(globalSessionId)) {
ret = av_buffersrc_close(ifilter->filter, pts, AV_BUFFERSRC_FLAG_PUSH); ret = av_buffersrc_close(ifilter->filter, pts, AV_BUFFERSRC_FLAG_PUSH);
} }
if (ret < 0) if (ret < 0)
@ -4986,7 +4986,7 @@ static int transcode(void)
goto fail; goto fail;
#endif #endif
while (!received_sigterm && !cancelRequested(sessionId)) { while (!received_sigterm && !cancelRequested(globalSessionId)) {
int64_t cur_time= av_gettime_relative(); int64_t cur_time= av_gettime_relative();
/* if 'q' pressed, exits */ /* if 'q' pressed, exits */
@ -5725,10 +5725,10 @@ int ffmpeg_execute(int argc, char **argv)
if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1]) if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1])
exit_program(69); exit_program(69);
exit_program((received_nb_signals || cancelRequested(sessionId))? 255 : main_ffmpeg_return_code); exit_program((received_nb_signals || cancelRequested(globalSessionId))? 255 : main_ffmpeg_return_code);
} else { } else {
main_ffmpeg_return_code = (received_nb_signals || cancelRequested(sessionId)) ? 255 : longjmp_value; main_ffmpeg_return_code = (received_nb_signals || cancelRequested(globalSessionId)) ? 255 : longjmp_value;
} }
return main_ffmpeg_return_code; return main_ffmpeg_return_code;

View File

@ -40,6 +40,7 @@
#include "libavutil/avassert.h" #include "libavutil/avassert.h"
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
#include "libavutil/bprint.h" #include "libavutil/bprint.h"
#include "libavutil/channel_layout.h"
#include "libavutil/display.h" #include "libavutil/display.h"
#include "libavutil/hash.h" #include "libavutil/hash.h"
#include "libavutil/hdr_dynamic_metadata.h" #include "libavutil/hdr_dynamic_metadata.h"
@ -1688,9 +1689,9 @@ static void xml_print_section_header(WriterContext *wctx)
wctx->section[wctx->level-1] : NULL; wctx->section[wctx->level-1] : NULL;
if (wctx->level == 0) { if (wctx->level == 0) {
const char *qual = " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " const char *qual = " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
"xmlns:ffprobe='http://www.ffmpeg.org/schema/ffprobe' " "xmlns:ffprobe=\"http://www.ffmpeg.org/schema/ffprobe\" "
"xsi:schemaLocation='http://www.ffmpeg.org/schema/ffprobe ffprobe.xsd'"; "xsi:schemaLocation=\"http://www.ffmpeg.org/schema/ffprobe ffprobe.xsd\"";
av_log(NULL, AV_LOG_STDERR, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); av_log(NULL, AV_LOG_STDERR, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
av_log(NULL, AV_LOG_STDERR, "<%sffprobe%s>\n", av_log(NULL, AV_LOG_STDERR, "<%sffprobe%s>\n",
@ -2032,7 +2033,7 @@ static void print_pkt_side_data(WriterContext *w,
print_int("dv_bl_signal_compatibility_id", dovi->dv_bl_signal_compatibility_id); print_int("dv_bl_signal_compatibility_id", dovi->dv_bl_signal_compatibility_id);
} else if (sd->type == AV_PKT_DATA_AUDIO_SERVICE_TYPE) { } else if (sd->type == AV_PKT_DATA_AUDIO_SERVICE_TYPE) {
enum AVAudioServiceType *t = (enum AVAudioServiceType *)sd->data; enum AVAudioServiceType *t = (enum AVAudioServiceType *)sd->data;
print_int("type", *t); print_int("service_type", *t);
} else if (sd->type == AV_PKT_DATA_MPEGTS_STREAM_ID) { } else if (sd->type == AV_PKT_DATA_MPEGTS_STREAM_ID) {
print_int("id", *sd->data); print_int("id", *sd->data);
} else if (sd->type == AV_PKT_DATA_CPB_PROPERTIES) { } else if (sd->type == AV_PKT_DATA_CPB_PROPERTIES) {
@ -2248,8 +2249,8 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream,
else print_str_opt("media_type", "unknown"); else print_str_opt("media_type", "unknown");
print_int("stream_index", stream->index); print_int("stream_index", stream->index);
print_int("key_frame", frame->key_frame); print_int("key_frame", frame->key_frame);
print_ts ("pkt_pts", frame->pts); print_ts ("pts", frame->pts);
print_time("pkt_pts_time", frame->pts, &stream->time_base); print_time("pts_time", frame->pts, &stream->time_base);
print_ts ("pkt_dts", frame->pkt_dts); print_ts ("pkt_dts", frame->pkt_dts);
print_time("pkt_dts_time", frame->pkt_dts, &stream->time_base); print_time("pkt_dts_time", frame->pkt_dts, &stream->time_base);
print_ts ("best_effort_timestamp", frame->best_effort_timestamp); print_ts ("best_effort_timestamp", frame->best_effort_timestamp);
@ -3081,8 +3082,7 @@ static void close_input_file(InputFile *ifile)
/* close decoder for each stream */ /* close decoder for each stream */
for (i = 0; i < ifile->nb_streams; i++) for (i = 0; i < ifile->nb_streams; i++)
if (ifile->streams[i].st->codecpar->codec_id != AV_CODEC_ID_NONE) avcodec_free_context(&ifile->streams[i].dec_ctx);
avcodec_free_context(&ifile->streams[i].dec_ctx);
av_freep(&ifile->streams); av_freep(&ifile->streams);
ifile->nb_streams = 0; ifile->nb_streams = 0;
@ -3747,6 +3747,7 @@ int ffprobe_execute(int argc, char **argv)
{ "report", 0, { .func_arg = opt_report }, "generate a report" }, { "report", 0, { .func_arg = opt_report }, "generate a report" },
{ "max_alloc", HAS_ARG, { .func_arg = opt_max_alloc }, "set maximum size of a single allocated block", "bytes" }, { "max_alloc", HAS_ARG, { .func_arg = opt_max_alloc }, "set maximum size of a single allocated block", "bytes" },
{ "cpuflags", HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags }, "force specific cpu flags", "flags" }, { "cpuflags", HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags }, "force specific cpu flags", "flags" },
{ "cpucount", HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpucount }, "force specific cpu count", "count" },
{ "hide_banner", OPT_BOOL | OPT_EXPERT, {&hide_banner}, "do not show program banner", "hide_banner" }, { "hide_banner", OPT_BOOL | OPT_EXPERT, {&hide_banner}, "do not show program banner", "hide_banner" },
#if CONFIG_AVDEVICE #if CONFIG_AVDEVICE
@ -3830,7 +3831,6 @@ int ffprobe_execute(int argc, char **argv)
ffprobe_options = options; ffprobe_options = options;
parse_loglevel(argc, argv, options); parse_loglevel(argc, argv, options);
avformat_network_init(); avformat_network_init();
init_opts();
#if CONFIG_AVDEVICE #if CONFIG_AVDEVICE
avdevice_register_all(); avdevice_register_all();
#endif #endif