贵港吾悦商业管理有限公司多角色网上演练(吾悦广场)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

147 lines
2.8 KiB

// ffmpeg_wrapper.c
// FFmpegTest_4
//
// Created by tanyamax on 16.09.17.
// Copyright © 2017 MaxBotvinev. All rights reserved.
//
#include "ffmpeg_wrapper.h"
#include "c_string.h"
#include "FileLogger/FileLogger.h"
//Interface
#ifdef __cplusplus
extern "C" {
#endif
void *execute(char ** argv, int argc, void (*callback)(const char*));
#ifdef __cplusplus
}
#endif
struct pthread_data {
int argc;
char ** argv;
};
struct pthread_data * data;
const char * log_buffer;
//CALLBACKS
//------------------------------
void main_callback(int error, char * event, const char * msg) {
//Clear
if((char *)log_buffer)
free((char *)log_buffer);
//Prepare
const char * ERROR_KEY = "FFmpeg EXCEPTION: ";
const char * COMMAND_KEY = "FFmpeg COMMAND: ";
//Unsafe
const char * prefix = append(error ? ERROR_KEY : COMMAND_KEY, event);
//File Ops
write_to_file(msg);
const char * suffix = read_from_file();
//Unsafe
log_buffer = append(prefix, suffix);
free((char *)prefix);
//Output
callback_ptr(log_buffer);
}
void on_start() {
main_callback(0, "onStart", "\nStarted\n");
}
void on_progress(const char * msg) {
main_callback(0, "onProgress: ", msg);
}
void on_failure() {
main_callback(0, "onFailure: ", "Failure. Search details above.\n");
}
void on_success() {
main_callback(0, "onSuccess: ", "Success!\n");
}
void on_finish() {
free(data->argv);
free(data);
main_callback(0, "onFinish", "\nFinished\n");
}
void error_callback(const char * msg) {
main_callback(1, "\nError:\n", msg);
}
//------------------------------
//LUNCH
//------------------------------
void * pthread_execute(void * _data) {
data = (struct pthread_data *)_data;
ffmpeg_main(
data->argc,
data->argv);
return NULL;
}
//------------------------------
//INTERFACE
//------------------------------
void *execute(char ** argv, int argc, void (*callback)(const char*)) {
//Clear Output Data
clear_file();
//Copy Input Data
int arguments_count = argc + 1;
char ** arguments = calloc(arguments_count, sizeof(char*));
arguments[0] = "ffmpeg";
int a1, a2;
printf("\nC side Arguments:\n");
for(a1 = 0, a2 = 1; a1 < argc; a1++, a2++) {
arguments[a2] = strdup(argv[a1]);
printf("%d Arg: %s\n", a2, arguments[a2]);
}
//Open thread
pthread_t thread;
struct pthread_data * data = calloc(argc, sizeof(char*));
data->argv = arguments;
data->argc = arguments_count;
callback_ptr = callback;
//Create a thread and exectute
pthread_create(&thread, NULL, pthread_execute, (void *)data);
return NULL;
}
//------------------------------