Error when using libavcodec dll in vc++
-
Hi, In continuance with my earlier posts,I can now link this dll and am also able to call some of its functions without any problems.
AVCodecContext *avctx; AVCodec *codec; avctx = new AVCodecContext; codec = new AVCodec; HMODULE hDll = LoadLibrary("avcodec.dll"); if(hDll== NULL) { CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str); AfxMessageBox("first"); AfxMessageBox("Failed loading1"); } typedef void (avcodec_init)(); avcodec_init* p = (avcodec_init*)GetProcAddress(hDll, "avcodec_init"); if(p==NULL) AfxMessageBox("Failed loading2"); p(); //FreeLibrary(hDll); HMODULE hDll1a = LoadLibrary("avcodec.dll"); typedef void (avcodec_register_all)(); avcodec_register_all* p1a = (avcodec_register_all*)GetProcAddress(hDll1a, "avcodec_register_all"); if(p1a==NULL) AfxMessageBox("Failed loading3"); p1a(); if(p1a==NULL) AfxMessageBox("Failed loading1.1"); HMODULE hDll3 = LoadLibrary("avcodec.dll"); typedef void (avcodec_find_encoder)(int CODECID); avcodec_find_encoder* p3 = (avcodec_find_encoder*)GetProcAddress(hDll3, "avcodec_find_encoder"); if(p3==NULL) AfxMessageBox("Failed loading3"); p3(CODEC_ID_MP2); if(p3==NULL) AfxMessageBox("Failed loading3"); codec=(AVCodec *)p3; HMODULE hDll4 = LoadLibrary("avcodec.dll"); //(hDll should not be NULL here) typedef void (avcodec_alloc_context)(); avcodec_alloc_context* p4 = (avcodec_alloc_context*)GetProcAddress(hDll4, "avcodec_alloc_context"); if(p4==NULL) AfxMessageBox("Failed loading4"); p4(); if(p4==NULL) AfxMessageBox("Failed loading4"); avctx=(AVCodecContext *)p4; if(avctx==NULL){ CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str);} avctx->bit_rate=64000;
The last line throws the error and AfxMessageBox simply displays the number 2. The HELP section has no entry for 2. Somebody please help!! -
Hi, In continuance with my earlier posts,I can now link this dll and am also able to call some of its functions without any problems.
AVCodecContext *avctx; AVCodec *codec; avctx = new AVCodecContext; codec = new AVCodec; HMODULE hDll = LoadLibrary("avcodec.dll"); if(hDll== NULL) { CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str); AfxMessageBox("first"); AfxMessageBox("Failed loading1"); } typedef void (avcodec_init)(); avcodec_init* p = (avcodec_init*)GetProcAddress(hDll, "avcodec_init"); if(p==NULL) AfxMessageBox("Failed loading2"); p(); //FreeLibrary(hDll); HMODULE hDll1a = LoadLibrary("avcodec.dll"); typedef void (avcodec_register_all)(); avcodec_register_all* p1a = (avcodec_register_all*)GetProcAddress(hDll1a, "avcodec_register_all"); if(p1a==NULL) AfxMessageBox("Failed loading3"); p1a(); if(p1a==NULL) AfxMessageBox("Failed loading1.1"); HMODULE hDll3 = LoadLibrary("avcodec.dll"); typedef void (avcodec_find_encoder)(int CODECID); avcodec_find_encoder* p3 = (avcodec_find_encoder*)GetProcAddress(hDll3, "avcodec_find_encoder"); if(p3==NULL) AfxMessageBox("Failed loading3"); p3(CODEC_ID_MP2); if(p3==NULL) AfxMessageBox("Failed loading3"); codec=(AVCodec *)p3; HMODULE hDll4 = LoadLibrary("avcodec.dll"); //(hDll should not be NULL here) typedef void (avcodec_alloc_context)(); avcodec_alloc_context* p4 = (avcodec_alloc_context*)GetProcAddress(hDll4, "avcodec_alloc_context"); if(p4==NULL) AfxMessageBox("Failed loading4"); p4(); if(p4==NULL) AfxMessageBox("Failed loading4"); avctx=(AVCodecContext *)p4; if(avctx==NULL){ CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str);} avctx->bit_rate=64000;
The last line throws the error and AfxMessageBox simply displays the number 2. The HELP section has no entry for 2. Somebody please help!!First thing, it is unnecessary to call LoadLibrary multiple times. Once you get the handle, you can load as many functions as you want with the same handle. So remove the redundant LoadLibrary.
RahulOP wrote:
avctx=(AVCodecContext *)p4; if(avctx==NULL){ CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str);} avctx->bit_rate=64000;
And what are you trying to do here ? You are casting a function pointer into a pointer of type AVCodecContext*. That's logical that you will have some problems. You try to get a return from the function ? Then you need to put the exact function prototype in the typedef (with the return and the arguments of the function). Then, you can simply call it like another function and get the returned value.
Cédric Moonen Software developer
Charting control -
Hi, In continuance with my earlier posts,I can now link this dll and am also able to call some of its functions without any problems.
AVCodecContext *avctx; AVCodec *codec; avctx = new AVCodecContext; codec = new AVCodec; HMODULE hDll = LoadLibrary("avcodec.dll"); if(hDll== NULL) { CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str); AfxMessageBox("first"); AfxMessageBox("Failed loading1"); } typedef void (avcodec_init)(); avcodec_init* p = (avcodec_init*)GetProcAddress(hDll, "avcodec_init"); if(p==NULL) AfxMessageBox("Failed loading2"); p(); //FreeLibrary(hDll); HMODULE hDll1a = LoadLibrary("avcodec.dll"); typedef void (avcodec_register_all)(); avcodec_register_all* p1a = (avcodec_register_all*)GetProcAddress(hDll1a, "avcodec_register_all"); if(p1a==NULL) AfxMessageBox("Failed loading3"); p1a(); if(p1a==NULL) AfxMessageBox("Failed loading1.1"); HMODULE hDll3 = LoadLibrary("avcodec.dll"); typedef void (avcodec_find_encoder)(int CODECID); avcodec_find_encoder* p3 = (avcodec_find_encoder*)GetProcAddress(hDll3, "avcodec_find_encoder"); if(p3==NULL) AfxMessageBox("Failed loading3"); p3(CODEC_ID_MP2); if(p3==NULL) AfxMessageBox("Failed loading3"); codec=(AVCodec *)p3; HMODULE hDll4 = LoadLibrary("avcodec.dll"); //(hDll should not be NULL here) typedef void (avcodec_alloc_context)(); avcodec_alloc_context* p4 = (avcodec_alloc_context*)GetProcAddress(hDll4, "avcodec_alloc_context"); if(p4==NULL) AfxMessageBox("Failed loading4"); p4(); if(p4==NULL) AfxMessageBox("Failed loading4"); avctx=(AVCodecContext *)p4; if(avctx==NULL){ CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str);} avctx->bit_rate=64000;
The last line throws the error and AfxMessageBox simply displays the number 2. The HELP section has no entry for 2. Somebody please help!!According to documentation (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp[^])
2
is the code forERROR_FILE_NOT_FOUND
error ("The system cannot find the file specified"). You should find which was the last function causing this error. You last line gives exception because of theNULL
value ofavctx
pointer. I think you have to put areturn
instruction afterAfxMessageBox
, or to useelse
. -
First thing, it is unnecessary to call LoadLibrary multiple times. Once you get the handle, you can load as many functions as you want with the same handle. So remove the redundant LoadLibrary.
RahulOP wrote:
avctx=(AVCodecContext *)p4; if(avctx==NULL){ CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str);} avctx->bit_rate=64000;
And what are you trying to do here ? You are casting a function pointer into a pointer of type AVCodecContext*. That's logical that you will have some problems. You try to get a return from the function ? Then you need to put the exact function prototype in the typedef (with the return and the arguments of the function). Then, you can simply call it like another function and get the returned value.
Cédric Moonen Software developer
Charting controlCedric Moonen wrote: And what are you trying to do here ? You are casting a function pointer into a pointer of type AVCodecContext*. That's logical that you will have some problems. You try to get a return from the function ? Then you need to put the exact function prototype in the typedef (with the return and the arguments of the function). Then, you can simply call it like another function and get the returned value.
AVCodecContext is defined in avcodec.h as struct. I am sorry but I havent understood what you've written. Its gone so over my head, if I were to look up, it'd be a tiny speck :-(
-
Cedric Moonen wrote: And what are you trying to do here ? You are casting a function pointer into a pointer of type AVCodecContext*. That's logical that you will have some problems. You try to get a return from the function ? Then you need to put the exact function prototype in the typedef (with the return and the arguments of the function). Then, you can simply call it like another function and get the returned value.
AVCodecContext is defined in avcodec.h as struct. I am sorry but I havent understood what you've written. Its gone so over my head, if I were to look up, it'd be a tiny speck :-(
RahulOP wrote:
AVCodecContext is defined in avcodec.h as struct.
Yes, basically, what you have is a pointer to a function (p4) and you try to cast this pointer to a structure AVCodecContext. Which is of course totally impossible. Why are you trying to do such a thing ? I guess it is because the function you get from the dll must return a strcture of this type, right ? So, what you need to do, is declaring your prototype this way. Instead of:
typedef void (avcodec_alloc_context)();
write:
typedef AVCodecContext* (avcodec_alloc_context)();
Then, once you get the function from your dll (p4), simply call the function like you would do for a standard function:
AVCodecContext *avctx = p4();
The function will be called and it will return your pointer. I guess you want to do that but I'm not sure. Could you confirm this please ? Important: your typedefs must match exactly the prototype of the function inside your dll !! So, if your func returns an int, the typedef needs to return an int also. BTW, where is this dll coming from ? Don't you have a header file and a lib file supplied with it ? This will be much easier for you. Another thing: I see that on the top of the code snippet, you create a new VCodecContext structure (using new) but later, you assign a new value to this pointer. So, the memory is never released and you get a memory leak.
Cédric Moonen Software developer
Charting control -
RahulOP wrote:
AVCodecContext is defined in avcodec.h as struct.
Yes, basically, what you have is a pointer to a function (p4) and you try to cast this pointer to a structure AVCodecContext. Which is of course totally impossible. Why are you trying to do such a thing ? I guess it is because the function you get from the dll must return a strcture of this type, right ? So, what you need to do, is declaring your prototype this way. Instead of:
typedef void (avcodec_alloc_context)();
write:
typedef AVCodecContext* (avcodec_alloc_context)();
Then, once you get the function from your dll (p4), simply call the function like you would do for a standard function:
AVCodecContext *avctx = p4();
The function will be called and it will return your pointer. I guess you want to do that but I'm not sure. Could you confirm this please ? Important: your typedefs must match exactly the prototype of the function inside your dll !! So, if your func returns an int, the typedef needs to return an int also. BTW, where is this dll coming from ? Don't you have a header file and a lib file supplied with it ? This will be much easier for you. Another thing: I see that on the top of the code snippet, you create a new VCodecContext structure (using new) but later, you assign a new value to this pointer. So, the memory is never released and you get a memory leak.
Cédric Moonen Software developer
Charting controlI am using FFMPEG. Rather I built FFMPEG using MSYS and am using the dlls I got from there. Yes I got the lib files as well and trying to do the same
avocdec_init();
directly gave me a lot of linker errors LNK 2019 and LNK2001. You can see the avcodec.h file here http://svn.mplayerhq.hu/ffmpeg/trunk/libavcodec/ There's also an apiexample.c which is what I am trying to work off from. I was under the impression that I am supposed to use the new when I initialise. Thank you for your help so far :) -
I am using FFMPEG. Rather I built FFMPEG using MSYS and am using the dlls I got from there. Yes I got the lib files as well and trying to do the same
avocdec_init();
directly gave me a lot of linker errors LNK 2019 and LNK2001. You can see the avcodec.h file here http://svn.mplayerhq.hu/ffmpeg/trunk/libavcodec/ There's also an apiexample.c which is what I am trying to work off from. I was under the impression that I am supposed to use the new when I initialise. Thank you for your help so far :)You didn't answer my question: are you trying to do what I asked ? So, you have a function that returns a strcture (or a pointer to the struct) and you want to get it ? What is the exact prototype of the function "avcodec_alloc_context" ?
RahulOP wrote:
gave me a lot of linker errors LNK 2019 and LNK2001
Did you link properly to the lib file ? So, did you add the lib in the project settings ? Instead of taking a complicated way, why don't you simply try to correct the initial errors ? If this dll is supplied with a lib file and a header file, then you can simply implicitely load the dll (not using LoadLibrary and GetProcAddress, but simply add the header file to your project and link to the library), this is much more easier to manage.
Cédric Moonen Software developer
Charting control -
Hi, In continuance with my earlier posts,I can now link this dll and am also able to call some of its functions without any problems.
AVCodecContext *avctx; AVCodec *codec; avctx = new AVCodecContext; codec = new AVCodec; HMODULE hDll = LoadLibrary("avcodec.dll"); if(hDll== NULL) { CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str); AfxMessageBox("first"); AfxMessageBox("Failed loading1"); } typedef void (avcodec_init)(); avcodec_init* p = (avcodec_init*)GetProcAddress(hDll, "avcodec_init"); if(p==NULL) AfxMessageBox("Failed loading2"); p(); //FreeLibrary(hDll); HMODULE hDll1a = LoadLibrary("avcodec.dll"); typedef void (avcodec_register_all)(); avcodec_register_all* p1a = (avcodec_register_all*)GetProcAddress(hDll1a, "avcodec_register_all"); if(p1a==NULL) AfxMessageBox("Failed loading3"); p1a(); if(p1a==NULL) AfxMessageBox("Failed loading1.1"); HMODULE hDll3 = LoadLibrary("avcodec.dll"); typedef void (avcodec_find_encoder)(int CODECID); avcodec_find_encoder* p3 = (avcodec_find_encoder*)GetProcAddress(hDll3, "avcodec_find_encoder"); if(p3==NULL) AfxMessageBox("Failed loading3"); p3(CODEC_ID_MP2); if(p3==NULL) AfxMessageBox("Failed loading3"); codec=(AVCodec *)p3; HMODULE hDll4 = LoadLibrary("avcodec.dll"); //(hDll should not be NULL here) typedef void (avcodec_alloc_context)(); avcodec_alloc_context* p4 = (avcodec_alloc_context*)GetProcAddress(hDll4, "avcodec_alloc_context"); if(p4==NULL) AfxMessageBox("Failed loading4"); p4(); if(p4==NULL) AfxMessageBox("Failed loading4"); avctx=(AVCodecContext *)p4; if(avctx==NULL){ CString str; int a = GetLastError(); str.Format("%d",a); AfxMessageBox(str);} avctx->bit_rate=64000;
The last line throws the error and AfxMessageBox simply displays the number 2. The HELP section has no entry for 2. Somebody please help!!RahulOP wrote:
avctx=(AVCodecContext *)p4;
This might be a Lost in the casting... kind :^) AVCodecContext :suss:
--[:jig:]-- [My Current Status]
-
You didn't answer my question: are you trying to do what I asked ? So, you have a function that returns a strcture (or a pointer to the struct) and you want to get it ? What is the exact prototype of the function "avcodec_alloc_context" ?
RahulOP wrote:
gave me a lot of linker errors LNK 2019 and LNK2001
Did you link properly to the lib file ? So, did you add the lib in the project settings ? Instead of taking a complicated way, why don't you simply try to correct the initial errors ? If this dll is supplied with a lib file and a header file, then you can simply implicitely load the dll (not using LoadLibrary and GetProcAddress, but simply add the header file to your project and link to the library), this is much more easier to manage.
Cédric Moonen Software developer
Charting control -
You didn't answer my question: are you trying to do what I asked ? So, you have a function that returns a strcture (or a pointer to the struct) and you want to get it ? What is the exact prototype of the function "avcodec_alloc_context" ?
RahulOP wrote:
gave me a lot of linker errors LNK 2019 and LNK2001
Did you link properly to the lib file ? So, did you add the lib in the project settings ? Instead of taking a complicated way, why don't you simply try to correct the initial errors ? If this dll is supplied with a lib file and a header file, then you can simply implicitely load the dll (not using LoadLibrary and GetProcAddress, but simply add the header file to your project and link to the library), this is much more easier to manage.
Cédric Moonen Software developer
Charting controlQuoting from the apiexample.c
AVCodec *codec; AVCodecContext *c= NULL; int frame_size, i, j, out_size, outbuf_size; FILE *f; short *samples; float t, tincr; uint8_t *outbuf; /* find the MP2 encoder */ codec = avcodec_find_encoder(CODEC_ID_MP2); c= avcodec_alloc_context(); /* put sample parameters */ c->bit_rate = 64000; c->sample_rate = 44100; c->channels = 2;
This is what I am trying to re-write. This is how alloc_code_context is defined in the .h fileAVCodecContext *avcodec_alloc_context(void);
:doh: I just tried thistypedef AVCodecContext*(avcodec_alloc_context)();
and I didnt have any errors.It ran perfectly. Though yes, there is something about memory leaks.Thank you so much for the heads-up -
-
Quoting from the apiexample.c
AVCodec *codec; AVCodecContext *c= NULL; int frame_size, i, j, out_size, outbuf_size; FILE *f; short *samples; float t, tincr; uint8_t *outbuf; /* find the MP2 encoder */ codec = avcodec_find_encoder(CODEC_ID_MP2); c= avcodec_alloc_context(); /* put sample parameters */ c->bit_rate = 64000; c->sample_rate = 44100; c->channels = 2;
This is what I am trying to re-write. This is how alloc_code_context is defined in the .h fileAVCodecContext *avcodec_alloc_context(void);
:doh: I just tried thistypedef AVCodecContext*(avcodec_alloc_context)();
and I didnt have any errors.It ran perfectly. Though yes, there is something about memory leaks.Thank you so much for the heads-upIt seems that you didn't read properly everything I wrote :|. Or you didn't understand. Basically, it's exactly what I'm trying to say till the begining: that you have to use the exact prototype for the typedef (so, with return type and parameters). Anyway, why don't you focus on your main problem ? Which is these link errors you get when you use the header and the lib ? Did you even try that ? Are you sure you properly linked to the library ? Please when answering, read at least my post and answer the questions I ask (there is a reason for which I ask these, even if this is pretty obscure to you).
Cédric Moonen Software developer
Charting control -
Quoting from the apiexample.c
AVCodec *codec; AVCodecContext *c= NULL; int frame_size, i, j, out_size, outbuf_size; FILE *f; short *samples; float t, tincr; uint8_t *outbuf; /* find the MP2 encoder */ codec = avcodec_find_encoder(CODEC_ID_MP2); c= avcodec_alloc_context(); /* put sample parameters */ c->bit_rate = 64000; c->sample_rate = 44100; c->channels = 2;
This is what I am trying to re-write. This is how alloc_code_context is defined in the .h fileAVCodecContext *avcodec_alloc_context(void);
:doh: I just tried thistypedef AVCodecContext*(avcodec_alloc_context)();
and I didnt have any errors.It ran perfectly. Though yes, there is something about memory leaks.Thank you so much for the heads-upCan you e-mail me the files? DejaVuNic -at- Gmail I'll try it a try.
--[:jig:]-- [My Current Status]
-
It seems that you didn't read properly everything I wrote :|. Or you didn't understand. Basically, it's exactly what I'm trying to say till the begining: that you have to use the exact prototype for the typedef (so, with return type and parameters). Anyway, why don't you focus on your main problem ? Which is these link errors you get when you use the header and the lib ? Did you even try that ? Are you sure you properly linked to the library ? Please when answering, read at least my post and answer the questions I ask (there is a reason for which I ask these, even if this is pretty obscure to you).
Cédric Moonen Software developer
Charting controlI am so sorry. I tried the
typedef AVCodecContext*
thingy based on your post except that I didnt quote it in my reply. I believe I am properly linked to the library files. These are the steps I followed In the project Properties Select C/C++ General Tab and set the path for 'Include directories' seperated by semicolon( i.e path to libavcodec, libavformat) In the Linker Tab put the path to Lib files of ffmpeg in the option 'Additional Library Directories path' (i.e the path to avformat.lib etc) In the Linker Tab Put the Library files names to the option 'Additional dependencies' ( avformat.lib avcodec.lib) These are the linker errors I am getting fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2019: unresolved external symbol ___divdi3 referenced in function _av_reduce fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2019: unresolved external symbol ___moddi3 referenced in function _av_reduce fflib2 error LNK2001: unresolved external symbol ___moddi3 fflib2 error LNK2001: unresolved external symbol ___moddi3 fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2019: unresolved external symbol __alloca referenced in function _rd8x8_c fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2019: unresolved external symbol ___udivdi3 referenced in function _mpeg1_encode_sequence_header fflib2 error LNK2019: unresolved external symbol ___udivdi3 referenced in function _MPV_common_end fflib2 error LNK2019: unresolved external symbol ___umoddi3 referenced in function _mpeg1_encode_sequence_header fflib2 error LNK2019: unresolved external symbol ___fixunssfdi referenced in function _ff_rate_control_init fflib2 error LNK2019: unresolved external symbol ___fixunsdfdi referenced in function _ff_rate_estimate_qscale p.s. Would you mind giving me your e-mail address? -
I am so sorry. I tried the
typedef AVCodecContext*
thingy based on your post except that I didnt quote it in my reply. I believe I am properly linked to the library files. These are the steps I followed In the project Properties Select C/C++ General Tab and set the path for 'Include directories' seperated by semicolon( i.e path to libavcodec, libavformat) In the Linker Tab put the path to Lib files of ffmpeg in the option 'Additional Library Directories path' (i.e the path to avformat.lib etc) In the Linker Tab Put the Library files names to the option 'Additional dependencies' ( avformat.lib avcodec.lib) These are the linker errors I am getting fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2019: unresolved external symbol ___divdi3 referenced in function _av_reduce fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2001: unresolved external symbol ___divdi3 fflib2 error LNK2019: unresolved external symbol ___moddi3 referenced in function _av_reduce fflib2 error LNK2001: unresolved external symbol ___moddi3 fflib2 error LNK2001: unresolved external symbol ___moddi3 fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2019: unresolved external symbol __alloca referenced in function _rd8x8_c fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2001: unresolved external symbol __alloca fflib2 error LNK2019: unresolved external symbol ___udivdi3 referenced in function _mpeg1_encode_sequence_header fflib2 error LNK2019: unresolved external symbol ___udivdi3 referenced in function _MPV_common_end fflib2 error LNK2019: unresolved external symbol ___umoddi3 referenced in function _mpeg1_encode_sequence_header fflib2 error LNK2019: unresolved external symbol ___fixunssfdi referenced in function _ff_rate_control_init fflib2 error LNK2019: unresolved external symbol ___fixunsdfdi referenced in function _ff_rate_estimate_qscale p.s. Would you mind giving me your e-mail address?Hmmm, strange... Are you sure you linked to all the required libraries ? Didn't you forget some ? Is there any documentation you can read and check if you did everything properly ?
RahulOP wrote:
Would you mind giving me your e-mail address?
I would prefer not to do that. Because this is a forum so if we find a solution to your problem, this can be usefull to somebody else.
Cédric Moonen Software developer
Charting control -
Hmmm, strange... Are you sure you linked to all the required libraries ? Didn't you forget some ? Is there any documentation you can read and check if you did everything properly ?
RahulOP wrote:
Would you mind giving me your e-mail address?
I would prefer not to do that. Because this is a forum so if we find a solution to your problem, this can be usefull to somebody else.
Cédric Moonen Software developer
Charting controlWell, this is an open-source encoder/decoder. So I downloaded both a release version and the SVN version.The SVN version also contains a "libavutil" folder that isnt there in the release version. Apparently when you build the SVN version, you should get a lib for libavutil which you are supposed to link to your program.Unfortuantely I didnt get any lib only dlls for the 3 folders libavformat, libavcodec and libavutil. The documentation isnt very clear and is mostly for Linux. The release version built fine but it had only the 2 folders libavcodec and libavformat. The build on this one gave me the lib files that I am now using. -- modified at 6:05 Wednesday 14th June, 2006 I seem to make the most irresponsible of mistakes:doh: I formatted my system recently and hence missed out on this crucial step which I had done before the format Add a call to `vcvars32.bat' (which sets up the environment variables for the Visual C++ tools) as the first line of `msys.bat'. The standard location for `vcvars32.bat' is `C:\Program Files\Microsoft Visual Studio8\VC\bin\vcvars32.bat', and the standard location for `msys.bat' is `C:\msys\1.0\msys.bat'. If this corresponds to your setup, add the following line as the first line of `msys.bat': call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat" I have my lib files!!!! Yay!!!!!
-
Well, this is an open-source encoder/decoder. So I downloaded both a release version and the SVN version.The SVN version also contains a "libavutil" folder that isnt there in the release version. Apparently when you build the SVN version, you should get a lib for libavutil which you are supposed to link to your program.Unfortuantely I didnt get any lib only dlls for the 3 folders libavformat, libavcodec and libavutil. The documentation isnt very clear and is mostly for Linux. The release version built fine but it had only the 2 folders libavcodec and libavformat. The build on this one gave me the lib files that I am now using. -- modified at 6:05 Wednesday 14th June, 2006 I seem to make the most irresponsible of mistakes:doh: I formatted my system recently and hence missed out on this crucial step which I had done before the format Add a call to `vcvars32.bat' (which sets up the environment variables for the Visual C++ tools) as the first line of `msys.bat'. The standard location for `vcvars32.bat' is `C:\Program Files\Microsoft Visual Studio8\VC\bin\vcvars32.bat', and the standard location for `msys.bat' is `C:\msys\1.0\msys.bat'. If this corresponds to your setup, add the following line as the first line of `msys.bat': call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat" I have my lib files!!!! Yay!!!!!
All right to cut a long story short, the lib files were faulty. So I went back to Dynamic Linking.
AVCodec *codec; int i, out_size, size, x, y, outbuf_size; FILE *f; uint8_t *outbuf, *picture_buf; HMODULE hDll3 = LoadLibrary("avcodec.dll"); typedef void (avcodec_find_encoder)(int CODECID); avcodec_find_encoder* p3 = (avcodec_find_encoder*)GetProcAddress(hDll3, "avcodec_find_encoder"); if(p3==NULL) AfxMessageBox("Failed loading3"); p3(CODEC_ID_MPEG1VIDEO); if(p3==NULL) AfxMessageBox("Failed loading3"); codec=(AVCodec *)p3; HMODULE hDll4 = LoadLibrary("avcodec.dll"); //(hDll should not be NULL here) typedef AVCodecContext* (avcodec_alloc_context)(); avcodec_alloc_context* p4 = (avcodec_alloc_context*)GetProcAddress(hDll4, "avcodec_alloc_context"); if(p4==NULL) AfxMessageBox("Failed loading4"); p4(); if(p4==NULL) AfxMessageBox("Failed loading4"); AVCodecContext *avctx = p4(); avctx->bit_rate=400000; avctx->width = 352; avctx->height = 288; /* frames per second */ avctx->frame_rate = 25; avctx->frame_rate_base= 1; avctx->gop_size = 10; /* emit one intra frame every ten frames */ avctx->max_b_frames=1; HMODULE hDll2 = LoadLibrary("avcodec.dll"); //(hDll should not be NULL here) typedef int (avcodec_open)(AVCodecContext *avctx, AVCodec *codec); avcodec_open* p2 = (avcodec_open*)GetProcAddress(hDll2, "avcodec_open"); if(p2==NULL) AfxMessageBox("Failed loading2"); p2((AVCodecContext *)p4,(AVCodec*)p3);
Notice the last line--p2. p2 should be of the form (avctx,codec) i.e.alloc_code_context and avcodec_find_Encoder. The problem(given my display of my knowledge of pointes, does this really surprise you?) is that I cant pass avctx and codec directly. Also, since avctx takes values like bit_rate, width,height, those have to be reflected when I open the required codec. Any ideas?? -
All right to cut a long story short, the lib files were faulty. So I went back to Dynamic Linking.
AVCodec *codec; int i, out_size, size, x, y, outbuf_size; FILE *f; uint8_t *outbuf, *picture_buf; HMODULE hDll3 = LoadLibrary("avcodec.dll"); typedef void (avcodec_find_encoder)(int CODECID); avcodec_find_encoder* p3 = (avcodec_find_encoder*)GetProcAddress(hDll3, "avcodec_find_encoder"); if(p3==NULL) AfxMessageBox("Failed loading3"); p3(CODEC_ID_MPEG1VIDEO); if(p3==NULL) AfxMessageBox("Failed loading3"); codec=(AVCodec *)p3; HMODULE hDll4 = LoadLibrary("avcodec.dll"); //(hDll should not be NULL here) typedef AVCodecContext* (avcodec_alloc_context)(); avcodec_alloc_context* p4 = (avcodec_alloc_context*)GetProcAddress(hDll4, "avcodec_alloc_context"); if(p4==NULL) AfxMessageBox("Failed loading4"); p4(); if(p4==NULL) AfxMessageBox("Failed loading4"); AVCodecContext *avctx = p4(); avctx->bit_rate=400000; avctx->width = 352; avctx->height = 288; /* frames per second */ avctx->frame_rate = 25; avctx->frame_rate_base= 1; avctx->gop_size = 10; /* emit one intra frame every ten frames */ avctx->max_b_frames=1; HMODULE hDll2 = LoadLibrary("avcodec.dll"); //(hDll should not be NULL here) typedef int (avcodec_open)(AVCodecContext *avctx, AVCodec *codec); avcodec_open* p2 = (avcodec_open*)GetProcAddress(hDll2, "avcodec_open"); if(p2==NULL) AfxMessageBox("Failed loading2"); p2((AVCodecContext *)p4,(AVCodec*)p3);
Notice the last line--p2. p2 should be of the form (avctx,codec) i.e.alloc_code_context and avcodec_find_Encoder. The problem(given my display of my knowledge of pointes, does this really surprise you?) is that I cant pass avctx and codec directly. Also, since avctx takes values like bit_rate, width,height, those have to be reflected when I open the required codec. Any ideas??One thing you still didn't understand is that a line like as follow is completely wrong !!
codec=(AVCodec *)p3
Basically, p3 is a pointer to a function. The
(AVCodec *)
in front of it specifies that the pointer must in fact be interpreted as a pointer to a AVCodec structure. Which of course completely false. Please, take care of what I said previously ! If this function returns an AVCode pointer, then you should do this instead:HMODULE hDll3 = LoadLibrary("avcodec.dll");
typedef (AVCode*)(avcodec_find_encoder)(int CODECID);
avcodec_find_encoder* p3 = (avcodec_find_encoder*)GetProcAddress(hDll3, "avcodec_find_encoder");
if(p3==NULL)
AfxMessageBox("Failed loading3");
p3(CODEC_ID_MPEG1VIDEO);
if(p3==NULL)
AfxMessageBox("Failed loading3");// Call the function and get the result:
AVCodec* codec = p3(...);Also, note that in the typedef, you specified that this function receive a integer parameter, so of course you need to supply it also (note the ... in the function call). Next, I repeat it once again: don't call LoadLibrary multiple times for the same library, this is useless. And don't forget to call FreeLibrary after it. For this:
RahulOP wrote:
p2((AVCodecContext *)p4,(AVCodec*)p3);
This is the same as above: you cannot cast pointer to functions this way !!. What you need to do, is call p4 (and store the result somewhere, then call p3 and store the result somewhere and finally, call p2 and giving the previous results):
AVCodecContext* pContext = p4();
AVCoded* pCoded = p3(...); // Don't forget to pass a parameter// You can modify pContext and pCodec before passing them to p2, of course
p2(pContext,pCoded);
If you have problems, please update all the code with the remarks I explained here before posting another question (otherwise, I will correct the same things over and over again). If you don't understand something, ask for more information (instead of blindly copy/pasting). Hope this helps
Cédric Moonen Software developer
Charting control -
One thing you still didn't understand is that a line like as follow is completely wrong !!
codec=(AVCodec *)p3
Basically, p3 is a pointer to a function. The
(AVCodec *)
in front of it specifies that the pointer must in fact be interpreted as a pointer to a AVCodec structure. Which of course completely false. Please, take care of what I said previously ! If this function returns an AVCode pointer, then you should do this instead:HMODULE hDll3 = LoadLibrary("avcodec.dll");
typedef (AVCode*)(avcodec_find_encoder)(int CODECID);
avcodec_find_encoder* p3 = (avcodec_find_encoder*)GetProcAddress(hDll3, "avcodec_find_encoder");
if(p3==NULL)
AfxMessageBox("Failed loading3");
p3(CODEC_ID_MPEG1VIDEO);
if(p3==NULL)
AfxMessageBox("Failed loading3");// Call the function and get the result:
AVCodec* codec = p3(...);Also, note that in the typedef, you specified that this function receive a integer parameter, so of course you need to supply it also (note the ... in the function call). Next, I repeat it once again: don't call LoadLibrary multiple times for the same library, this is useless. And don't forget to call FreeLibrary after it. For this:
RahulOP wrote:
p2((AVCodecContext *)p4,(AVCodec*)p3);
This is the same as above: you cannot cast pointer to functions this way !!. What you need to do, is call p4 (and store the result somewhere, then call p3 and store the result somewhere and finally, call p2 and giving the previous results):
AVCodecContext* pContext = p4();
AVCoded* pCoded = p3(...); // Don't forget to pass a parameter// You can modify pContext and pCodec before passing them to p2, of course
p2(pContext,pCoded);
If you have problems, please update all the code with the remarks I explained here before posting another question (otherwise, I will correct the same things over and over again). If you don't understand something, ask for more information (instead of blindly copy/pasting). Hope this helps
Cédric Moonen Software developer
Charting control