Initial commit - from Precise source
[freerdp-ubuntu-pcb-backport.git] / channels / drdynvc / tsmf / tsmf_decoder.c
1 /**
2  * FreeRDP: A Remote Desktop Protocol client.
3  * Video Redirection Virtual Channel - Decoder
4  *
5  * Copyright 2010-2011 Vic Lee
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <freerdp/utils/memory.h>
24 #include <freerdp/utils/load_plugin.h>
25
26 #include "drdynvc_types.h"
27 #include "tsmf_types.h"
28 #include "tsmf_constants.h"
29 #include "tsmf_decoder.h"
30
31 static ITSMFDecoder* tsmf_load_decoder_by_name(const char* name, TS_AM_MEDIA_TYPE* media_type)
32 {
33         ITSMFDecoder* decoder;
34         TSMF_DECODER_ENTRY entry;
35         char* fullname;
36
37         if (strrchr(name, '.') != NULL)
38                 entry = (TSMF_DECODER_ENTRY) freerdp_load_plugin(name, TSMF_DECODER_EXPORT_FUNC_NAME);
39         else
40         {
41                 fullname = xzalloc(strlen(name) + 6);
42                 strcpy(fullname, "tsmf_");
43                 strcat(fullname, name);
44                 entry = (TSMF_DECODER_ENTRY) freerdp_load_plugin(fullname, TSMF_DECODER_EXPORT_FUNC_NAME);
45                 xfree(fullname);
46         }
47         if (entry == NULL)
48         {
49                 return NULL;
50         }
51
52         decoder = entry();
53         if (decoder == NULL)
54         {
55                 DEBUG_WARN("failed to call export function in %s", name);
56                 return NULL;
57         }
58         if (!decoder->SetFormat(decoder, media_type))
59         {
60                 decoder->Free(decoder);
61                 decoder = NULL;
62         }
63         return decoder;
64 }
65
66 ITSMFDecoder* tsmf_load_decoder(const char* name, TS_AM_MEDIA_TYPE* media_type)
67 {
68         ITSMFDecoder* decoder;
69
70         if (name)
71         {
72                 decoder = tsmf_load_decoder_by_name(name, media_type);
73         }
74         else
75         {
76                 decoder = tsmf_load_decoder_by_name("ffmpeg", media_type);
77         }
78
79         return decoder;
80 }
81