void test_remove_stringset(void) { char const *members1[] = { "watermelon", "mango", "apple", "banana", "strawberry" }; int members1_count = sizeof members1 / sizeof members1[0]; struct stringset *set1 = stringset_alloc_from_array(members1, members1_count); assert(set1); char const *members2[] = { "mango", "green", "banana" }; int members2_count = sizeof members2 / sizeof members2[0]; struct stringset *set2 = stringset_alloc_from_array(members2, members2_count); assert(set2); int result = stringset_remove_stringset(set1, set2); assert(0 == result); assert(3 == set1->count); assert(0 == strcmp("apple", set1->members[0])); assert(0 == strcmp("strawberry", set1->members[1])); assert(0 == strcmp("watermelon", set1->members[2])); stringset_free(set1); stringset_free(set2); }
int init_best_audio_codec(sh_audio_t *sh_audio, char **audio_codec_list, char **audio_fm_list) { stringset_t selected; char *ac_l_default[2] = { "", (char *) NULL }; // hack: if (!audio_codec_list) audio_codec_list = ac_l_default; // Go through the codec.conf and find the best codec... sh_audio->initialized = 0; stringset_init(&selected); while (!sh_audio->initialized && *audio_codec_list) { char *audio_codec = *(audio_codec_list++); if (audio_codec[0]) { if (audio_codec[0] == '-') { // disable this codec: stringset_add(&selected, audio_codec + 1); } else { // forced codec by name: mp_tmsg(MSGT_DECAUDIO, MSGL_INFO, "Forced audio codec: %s\n", audio_codec); init_audio(sh_audio, audio_codec, NULL, -1, &selected); } } else { int status; // try in stability order: UNTESTED, WORKING, BUGGY. // never try CRASHING. if (audio_fm_list) { char **fmlist = audio_fm_list; // try first the preferred codec families: while (!sh_audio->initialized && *fmlist) { char *audio_fm = *(fmlist++); mp_tmsg(MSGT_DECAUDIO, MSGL_INFO, "Trying to force audio codec driver family %s...\n", audio_fm); for (status = CODECS_STATUS__MAX; status >= CODECS_STATUS__MIN; --status) if (init_audio(sh_audio, NULL, audio_fm, status, &selected)) break; } } if (!sh_audio->initialized) for (status = CODECS_STATUS__MAX; status >= CODECS_STATUS__MIN; --status) if (init_audio(sh_audio, NULL, NULL, status, &selected)) break; } } stringset_free(&selected); if (!sh_audio->initialized) { mp_tmsg(MSGT_DECAUDIO, MSGL_ERR, "Cannot find codec for audio format 0x%X.\n", sh_audio->format); return 0; // failed } mp_tmsg(MSGT_DECAUDIO, MSGL_INFO, "Selected audio codec: [%s] afm: %s (%s)\n", sh_audio->codec->name, sh_audio->codec->drv, sh_audio->codec->info); return 1; // success }
int init_best_video_codec(sh_video_t *sh_video, char **video_codec_list, char **video_fm_list) { char *vc_l_default[2] = { "", (char *) NULL }; stringset_t selected; // hack: if (!video_codec_list) video_codec_list = vc_l_default; // Go through the codec.conf and find the best codec... sh_video->initialized = 0; stringset_init(&selected); while (!sh_video->initialized && *video_codec_list) { char *video_codec = *(video_codec_list++); if (video_codec[0]) { if (video_codec[0] == '-') { // disable this codec: stringset_add(&selected, video_codec + 1); } else { // forced codec by name: mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_ForcedVideoCodec, video_codec); init_video(sh_video, video_codec, NULL, -1, &selected); } } else { int status; // try in stability order: UNTESTED, WORKING, BUGGY. never try CRASHING. if (video_fm_list) { char **fmlist = video_fm_list; // try first the preferred codec families: while (!sh_video->initialized && *fmlist) { char *video_fm = *(fmlist++); mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_TryForceVideoFmtStr, video_fm); for (status = CODECS_STATUS__MAX; status >= CODECS_STATUS__MIN; --status) if (init_video (sh_video, NULL, video_fm, status, &selected)) break; } } if (!sh_video->initialized) for (status = CODECS_STATUS__MAX; status >= CODECS_STATUS__MIN; --status) if (init_video(sh_video, NULL, NULL, status, &selected)) break; } } stringset_free(&selected); if (!sh_video->initialized) { mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantFindVideoCodec, sh_video->format); return 0; // failed } mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_SelectedVideoCodec, sh_video->codec->name, sh_video->codec->drv, sh_video->codec->info); return 1; // success }