📄 lqt_ffmpeg.c
字号:
.index = -1, .encoder = NULL, .decoder = NULL, .short_name = "adpcm_ms", .name = TRS("FFMPEG McRowsoft ADPCM"), .fourccs = { "ms\0\x02", "MS\0\x02", (char*)0 }, .wav_ids = { 0x02, LQT_WAV_ID_NONE }, },#endif#if 1 /* Sounds ugly */ { .id = CODEC_ID_ADPCM_IMA_WAV, .index = -1, .encoder = NULL, .decoder = NULL, .short_name = "ima_adpcm_wav", .name = TRS("FFMPEG ADPCM ima WAV"), .fourccs = { "ms\0\x11", "MS\0\x11", (char*)0 }, .wav_ids = { 0x11, LQT_WAV_ID_NONE }, }#endif };#define NUMMAPS_A ((int)(sizeof(codecidmap_a)/sizeof(struct CODECIDMAP)))#define NUMMAPS_V ((int)(sizeof(codecidmap_v)/sizeof(struct CODECIDMAP)))// static void ffmpeg_map_init(void) __attribute__ ((constructor));static void ffmpeg_map_init(void) { int i; if(ffmpeg_num_video_codecs >= 0) { return; } avcodec_register_all(); avcodec_init(); ffmpeg_num_video_codecs = 0; ffmpeg_num_audio_codecs = 0; for(i = 0; i < NUMMAPS_V; i++) { if(codecidmap_v[i].do_encode) codecidmap_v[i].encoder = avcodec_find_encoder(codecidmap_v[i].id); codecidmap_v[i].decoder = avcodec_find_decoder(codecidmap_v[i].id); if(codecidmap_v[i].encoder || codecidmap_v[i].decoder) { codecidmap_v[i].index = ffmpeg_num_video_codecs++; } } for(i = 0; i < NUMMAPS_A; i++) { if(codecidmap_a[i].do_encode) codecidmap_a[i].encoder = avcodec_find_encoder(codecidmap_a[i].id); codecidmap_a[i].decoder = avcodec_find_decoder(codecidmap_a[i].id); if(codecidmap_a[i].encoder || codecidmap_a[i].decoder) { codecidmap_a[i].index = ffmpeg_num_audio_codecs++ + ffmpeg_num_video_codecs; } } }/* Template */static char ffmpeg_name[256];static char ffmpeg_long_name[256];static char ffmpeg_description[256];static lqt_codec_info_static_t codec_info_ffmpeg = { .name = ffmpeg_name, .long_name = ffmpeg_long_name, .description = ffmpeg_description, .fourccs = NULL, .wav_ids = NULL, .type = 0, .direction = 0, .encoding_parameters = NULL, .decoding_parameters = NULL };/* These are called from the plugin loader */LQT_EXTERN int get_num_codecs(){ ffmpeg_map_init(); return ffmpeg_num_video_codecs + ffmpeg_num_audio_codecs;}static void set_codec_info(struct CODECIDMAP * map) { // char * capabilities = (char*)0; codec_info_ffmpeg.fourccs = map->fourccs; codec_info_ffmpeg.wav_ids = map->wav_ids; if(map->encoder && map->decoder) { codec_info_ffmpeg.direction = LQT_DIRECTION_BOTH; codec_info_ffmpeg.encoding_parameters = map->encode_parameters; codec_info_ffmpeg.decoding_parameters = map->decode_parameters; // capabilities = "Codec"; codec_info_ffmpeg.compatibility_flags = map->compatibility_flags; } else if(map->encoder) { codec_info_ffmpeg.direction = LQT_DIRECTION_ENCODE; codec_info_ffmpeg.encoding_parameters = map->encode_parameters; codec_info_ffmpeg.decoding_parameters = NULL; codec_info_ffmpeg.compatibility_flags = map->compatibility_flags; // capabilities = "Encoder"; } else if(map->decoder) { codec_info_ffmpeg.direction = LQT_DIRECTION_DECODE; codec_info_ffmpeg.encoding_parameters = NULL; codec_info_ffmpeg.decoding_parameters = map->decode_parameters; // capabilities = "Decoder"; } snprintf(ffmpeg_name, 256, "ffmpeg_%s", map->short_name); snprintf(ffmpeg_long_name, 256, "%s", map->name); snprintf(ffmpeg_description, 256, "%s", map->name); if((map->encoder && (map->encoder->type == CODEC_TYPE_VIDEO)) || (map->decoder && (map->decoder->type == CODEC_TYPE_VIDEO))){ codec_info_ffmpeg.type = LQT_CODEC_VIDEO; } else { codec_info_ffmpeg.type = LQT_CODEC_AUDIO; } }static struct CODECIDMAP * find_codec(int index) { int i; for(i = 0; i < NUMMAPS_V; i++) { if(codecidmap_v[i].index == index) return &codecidmap_v[i]; } for(i = 0; i < NUMMAPS_A; i++) { if(codecidmap_a[i].index == index) return &codecidmap_a[i]; } return (struct CODECIDMAP *)0; }LQT_EXTERN lqt_codec_info_static_t * get_codec_info(int index){ struct CODECIDMAP * map; ffmpeg_map_init(); map = find_codec(index); // memset(&codec_info_ffmpeg, 0, sizeof(codec_info_ffmpeg)); if(map) { set_codec_info(map); return &codec_info_ffmpeg; } return NULL;}/* * Return the actual codec constructor *//* This is where it gets ugly - make sure there are enough dummys to handle all codecs!*/#define IFUNC(x) \static void quicktime_init_video_codec_ffmpeg ## x(quicktime_video_map_t *vtrack) \{ \ int i; \ for(i = 0; i < ffmpeg_num_video_codecs; i++) { \ if(codecidmap_v[i].index == x) { \ quicktime_init_video_codec_ffmpeg(vtrack, \ codecidmap_v[i].encoder, \ codecidmap_v[i].decoder); \ } \ } \}IFUNC(0)IFUNC(1)IFUNC(2)IFUNC(3)IFUNC(4)IFUNC(5)IFUNC(6)IFUNC(7)IFUNC(8)IFUNC(9)IFUNC(10)IFUNC(11)IFUNC(12)IFUNC(13)IFUNC(14)IFUNC(15)IFUNC(16)IFUNC(17)IFUNC(18)IFUNC(19)IFUNC(20)IFUNC(21)IFUNC(22)IFUNC(23)IFUNC(24)IFUNC(25)IFUNC(26)IFUNC(27)IFUNC(28)IFUNC(29)IFUNC(30)IFUNC(31)IFUNC(32)IFUNC(33)IFUNC(34)IFUNC(35)IFUNC(36)IFUNC(37)IFUNC(38)IFUNC(39)IFUNC(40)#undef IFUNC#define MAX_VIDEO_FUNC 40#define IFUNC(x) \static void quicktime_init_audio_codec_ffmpeg ## x(quicktime_audio_map_t *atrack) \{ \ int i; \ for(i = 0; i < ffmpeg_num_audio_codecs; i++) { \ if(codecidmap_a[i].index == x) { \ quicktime_init_audio_codec_ffmpeg(atrack, \ codecidmap_a[i].encoder, \ codecidmap_a[i].decoder); \ } \ } \}IFUNC(0)IFUNC(1)IFUNC(2)IFUNC(3)IFUNC(4)IFUNC(5)IFUNC(6)IFUNC(7)IFUNC(8)IFUNC(9)IFUNC(10)IFUNC(11)IFUNC(12)IFUNC(13)IFUNC(14)IFUNC(15)IFUNC(16)IFUNC(17)IFUNC(18)IFUNC(19)IFUNC(20)IFUNC(21)IFUNC(22)IFUNC(23)IFUNC(24)IFUNC(25)IFUNC(26)IFUNC(27)IFUNC(28)IFUNC(29)IFUNC(30)IFUNC(31)IFUNC(32)IFUNC(33)IFUNC(34)IFUNC(35)IFUNC(36)IFUNC(37)IFUNC(38)IFUNC(39)IFUNC(40)#define MAX_AUDIO_FUNC 40 #undef IFUNCLQT_EXTERN lqt_init_video_codec_func_t get_video_codec(int index){ ffmpeg_map_init(); if(index > MAX_VIDEO_FUNC) { lqt_log(NULL, LQT_LOG_ERROR, LOG_DOMAIN, "Video index too large: %d", index); return NULL; } switch(index) { case 0: return quicktime_init_video_codec_ffmpeg0; case 1: return quicktime_init_video_codec_ffmpeg1; case 2: return quicktime_init_video_codec_ffmpeg2; case 3: return quicktime_init_video_codec_ffmpeg3; case 4: return quicktime_init_video_codec_ffmpeg4; case 5: return quicktime_init_video_codec_ffmpeg5; case 6: return quicktime_init_video_codec_ffmpeg6; case 7: return quicktime_init_video_codec_ffmpeg7; case 8: return quicktime_init_video_codec_ffmpeg8; case 9: return quicktime_init_video_codec_ffmpeg9; case 10: return quicktime_init_video_codec_ffmpeg10; case 11: return quicktime_init_video_codec_ffmpeg11; case 12: return quicktime_init_video_codec_ffmpeg12; case 13: return quicktime_init_video_codec_ffmpeg13; case 14: return quicktime_init_video_codec_ffmpeg14; case 15: return quicktime_init_video_codec_ffmpeg15; case 16: return quicktime_init_video_codec_ffmpeg16; case 17: return quicktime_init_video_codec_ffmpeg17; case 18: return quicktime_init_video_codec_ffmpeg18; case 19: return quicktime_init_video_codec_ffmpeg19; case 20: return quicktime_init_video_codec_ffmpeg20; case 21: return quicktime_init_video_codec_ffmpeg21; case 22: return quicktime_init_video_codec_ffmpeg22; case 23: return quicktime_init_video_codec_ffmpeg23; case 24: return quicktime_init_video_codec_ffmpeg24; case 25: return quicktime_init_video_codec_ffmpeg25; case 26: return quicktime_init_video_codec_ffmpeg26; case 27: return quicktime_init_video_codec_ffmpeg27; case 28: return quicktime_init_video_codec_ffmpeg28; case 29: return quicktime_init_video_codec_ffmpeg29; case 30: return quicktime_init_video_codec_ffmpeg30; case 31: return quicktime_init_video_codec_ffmpeg31; case 32: return quicktime_init_video_codec_ffmpeg32; case 33: return quicktime_init_video_codec_ffmpeg33; case 34: return quicktime_init_video_codec_ffmpeg34; case 35: return quicktime_init_video_codec_ffmpeg35; case 36: return quicktime_init_video_codec_ffmpeg36; case 37: return quicktime_init_video_codec_ffmpeg37; case 38: return quicktime_init_video_codec_ffmpeg38; case 39: return quicktime_init_video_codec_ffmpeg39; case 40: return quicktime_init_video_codec_ffmpeg40; default: break; } return (lqt_init_video_codec_func_t)0;}LQT_EXTERN lqt_init_audio_codec_func_t get_audio_codec(int index){ ffmpeg_map_init(); if(index > MAX_AUDIO_FUNC) { lqt_log(NULL, LQT_LOG_ERROR, LOG_DOMAIN, "Audio index too large: %d", index); return NULL; } switch(index) { case 0: return quicktime_init_audio_codec_ffmpeg0; case 1: return quicktime_init_audio_codec_ffmpeg1; case 2: return quicktime_init_audio_codec_ffmpeg2; case 3: return quicktime_init_audio_codec_ffmpeg3; case 4: return quicktime_init_audio_codec_ffmpeg4; case 5: return quicktime_init_audio_codec_ffmpeg5; case 6: return quicktime_init_audio_codec_ffmpeg6; case 7: return quicktime_init_audio_codec_ffmpeg7; case 8: return quicktime_init_audio_codec_ffmpeg8; case 9: return quicktime_init_audio_codec_ffmpeg9; case 10: return quicktime_init_audio_codec_ffmpeg10; case 11: return quicktime_init_audio_codec_ffmpeg11; case 12: return quicktime_init_audio_codec_ffmpeg12; case 13: return quicktime_init_audio_codec_ffmpeg13; case 14: return quicktime_init_audio_codec_ffmpeg14; case 15: return quicktime_init_audio_codec_ffmpeg15; case 16: return quicktime_init_audio_codec_ffmpeg16; case 17: return quicktime_init_audio_codec_ffmpeg17; case 18: return quicktime_init_audio_codec_ffmpeg18; case 19: return quicktime_init_audio_codec_ffmpeg19; case 20: return quicktime_init_audio_codec_ffmpeg20; case 21: return quicktime_init_audio_codec_ffmpeg21; case 22: return quicktime_init_audio_codec_ffmpeg22; case 23: return quicktime_init_audio_codec_ffmpeg23; case 24: return quicktime_init_audio_codec_ffmpeg24; case 25: return quicktime_init_audio_codec_ffmpeg25; case 26: return quicktime_init_audio_codec_ffmpeg26; case 27: return quicktime_init_audio_codec_ffmpeg27; case 28: return quicktime_init_audio_codec_ffmpeg28; case 29: return quicktime_init_audio_codec_ffmpeg29; case 30: return quicktime_init_audio_codec_ffmpeg30; case 31: return quicktime_init_audio_codec_ffmpeg31; case 32: return quicktime_init_audio_codec_ffmpeg32; case 33: return quicktime_init_audio_codec_ffmpeg33; case 34: return quicktime_init_audio_codec_ffmpeg34; case 35: return quicktime_init_audio_codec_ffmpeg35; case 36: return quicktime_init_audio_codec_ffmpeg36; case 37: return quicktime_init_audio_codec_ffmpeg37; case 38: return quicktime_init_audio_codec_ffmpeg38; case 39: return quicktime_init_audio_codec_ffmpeg39; case 40: return quicktime_init_audio_codec_ffmpeg40; default: break; } return (lqt_init_audio_codec_func_t)0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -