+ if ( ((ctx->audio_filter_save_file) && (strlen(ctx->audio_filter_save_file)>0) && (sourcetype == AudioSourceDevice)) ||
+ ((ctx->video_filter_save_file) && (strlen(ctx->video_filter_save_file)>0) && (sourcetype == VideoSourceDevice)) ) {
+
+ HRESULT hr;
+ char *filename = NULL;
+
+ if (sourcetype == AudioSourceDevice)
+ filename = ctx->audio_filter_save_file;
+ else
+ filename = ctx->video_filter_save_file;
+
+ hr = SHCreateStreamOnFile ((LPCSTR) filename, STGM_CREATE | STGM_READWRITE, &ofile_stream);
+ if (S_OK != hr) {
+ av_log(avctx, AV_LOG_ERROR, "Could not create capture filter description file.\n");
+ goto error;
+ }
+
+ hr = IBaseFilter_QueryInterface(device_filter, &IID_IPersistStream, (void **) &pers_stream);
+ if (hr != S_OK) {
+ av_log(avctx, AV_LOG_ERROR, "Query for IPersistStream failed.\n");
+ goto error;
+ }
+
+ hr = OleSaveToStream(pers_stream, ofile_stream);
+ if (hr != S_OK) {
+ av_log(avctx, AV_LOG_ERROR, "Could not save capture filter \n");
+ goto error;
+ }
+
+ hr = IStream_Commit(ofile_stream, STGC_DEFAULT);
+ if (S_OK != hr) {
+ av_log(avctx, AV_LOG_ERROR, "Could not commit capture filter data to file.\n");
+ goto error;
+ }
+
+ if (sourcetype == AudioSourceDevice)
+ av_log(avctx, AV_LOG_INFO, "Audio-");
+ else
+ av_log(avctx, AV_LOG_INFO, "Video-");
+ av_log(avctx, AV_LOG_INFO, "Capture filter saved successfully to file \"%s\".\n", filename);
+ }
+