CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - FFMPEG i brak stabilnoci

FFMPEG i brak stabilnoci

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

FFMPEG i brak stabilnoci

Nowy postprzez pioro700 » czwartek, 1 sierpnia 2019, 12:35

Dobry dzień wszystkim.
Mój dzisiejszy problem to ... :)
Korzystając z FFMPEG napisałem funkcję wczytującą informacje z pliku wideo. Funkcja w sumie działa ale już przetworzenie informacji zwróconych przez nią, jak by to nie komputerowo ująć, jak chce :roll: . Dość często otrzymuję błąd "access violation", ale co dziwne nie za każdym razem.
Ogólny schemat działania:
1. plik MainUnit.cpp
KOD cpp:     UKRYJ  
void __fastcall TMainForm::OpenBtnClick(TObject *Sender)
{
   avFileMediaInfo *avInfo = new avFileMediaInfo;  // klasa którą stworzyłem dla potrzeb danych o pliku wideo
   bool mpeg = false;
   int counter = 0;
   do                                 //
          {
           try{
                         mpeg = FFOpenFile(*avInfo);
                  }
           catch(...) {}
           counter++;
          } while(!mpeg && counter < 5 && !avInfo->FileName.IsEmpty());

   if(mpeg)
          ShowMediaInfo(avInfo);
   else
          ShowMessage("nie można załadować pliku");
   delete avInfo;
}

później wytłumaczę tę totalnie zagmatwaną konstrukcję.

2. MainUnit.cpp
KOD cpp:     UKRYJ  
bool __fastcall TMainForm::FFOpenFile(avFileMediaInfo &avInfo)
{
        if(avInfo.FileName.IsEmpty())
           {
                   FileOpenDlg->Title = "Video";
                   FileOpenDlg->FileName = "";
                   FileOpenDlg->DefaultFolder = videoDir;
                   FileOpenDlg->FileTypes->Clear();
                   FileOpenDlg->FileTypes->Add();
                   FileOpenDlg->FileTypes->Items[0]->DisplayName = "Matroska";
                   FileOpenDlg->FileTypes->Items[0]->FileMask = "*.mkv";
                   FileOpenDlg->FileTypes->Add();
                   FileOpenDlg->FileTypes->Items[1]->DisplayName = "Advanced Video Coding MP4";
                   FileOpenDlg->FileTypes->Items[1]->FileMask =  "*.mp4";
                   FileOpenDlg->FileTypes->Add();
                   FileOpenDlg->FileTypes->Items[2]->DisplayName = "Transport Stream ";
                   FileOpenDlg->FileTypes->Items[2]->FileMask = "*.ts";
                   FileOpenDlg->FileTypes->Add();
                   FileOpenDlg->FileTypes->Items[3]->DisplayName = "Audio Video Interleaved";
                   FileOpenDlg->FileTypes->Items[3]->FileMask = "*.avi";
                   FileOpenDlg->FileTypeIndex = 0;

                   if(!FileOpenDlg->Execute())
                          return false;
                   else
                          avInfo.FileName = FileOpenDlg->FileName;
           }

        return MPEGFileInfo(avInfo) > 0;

teraz wyjaśnię kilka rzeczy.
* - kiedy po kliknięciu "OpenBtn" pobierałem tylko nazwę pliku z którego chciałem pobrać dane (funkcja "FFOpenFile") i wołałem funkcję "MPEGFileInfo", próbując wyświetlić otrzymane informacje zawsze otrzymywałem błąd pamięci (acces violation).
* - kiedy wywołanie funkcji "MPEGFileInfo" wstawiłem w funkcji "FFOpenFile" (tak jak na powyższym przykładzie), błąd pamięci zniknął .... ale nie zawsze, potrafi się od czasu do czasu pokazać.
i teraz mogę wyjaśnić zawiłość konstrukcji funkcji "OpenBtnClick".
Dziwną sprawą jest to, że mimo iż czasem wyskakuje błąd pamięci, przy powtórzeniu wczytania tego samego pliku, coś "zaskakuje" i pięknie wypisuje to co ma zrobić .... dlatego tak pogmatwałem tę pętelkę coby kilka razy klikać nie trzeba było ... :?

Ciekawe jest to, że sama funkcja "MPEGFileInfo" zawsze zwraca dane ... błąd występuje po powrocie z tej funkcji.
Teraz kod tej funkcji :

1. plik AFFMpeg. h

KOD cpp:     UKRYJ  
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/dict.h>
}
//---------------------------------------------------------------------------
extern "C"  {
typedef void(__stdcall* avRegisterAll)(void);
typedef int(__stdcall* avformatOpenInput)(AVFormatContext * *ps, const char *filename, AVInputFormat * fmt,
                                                                AVDictionary * *options);
typedef int(__stdcall* avformatFindStreamInfo)(AVFormatContext *ic, AVDictionary **options);
typedef void(__stdcall* avformatCloseInput)(AVFormatContext * *s);
typedef void(__stdcall* avDumpFormat)(AVFormatContext *ic, int index, const char *url, int is_output);
typedef AVFormatContext *(__stdcall* avformatAllocContext)(void);
typedef AVCodec *(__stdcall* avcodecFindDecoder) (AVCodecID id);
typedef AVDictionaryEntry *(__stdcall* avDictGet)(AVDictionary *m, const char *key,
                                                                                                        const AVDictionaryEntry *prev, int  flags);
}


static wchar_t *format_dll = L"avformat-58.dll";
static wchar_t *codec_dll = L"avcodec-58.dll";
static wchar_t *util_dll = L"avutil-56.dll";
//---------------------------------------------------------------------------
static HINSTANCE formatdll_handle;
static HINSTANCE codecdll_handle;
static HINSTANCE utildll_handle;
//---------------------------------------------------------------------------
/* funkcja inicjalizująca ładowanie dll. */
bool __fastcall FFmpegInitialize();
/* funkcja finalizująca połączenie z dll. */
bool __fastcall FFmpegClose();
........
.......
 


2. plik AFFMpeg. cpp

KOD cpp:     UKRYJ  
bool __fastcall FFmpegInitialize()
{
        if((codecdll_handle = LoadLibrary(codec_dll)) == NULL)
           return false;

        if((formatdll_handle = LoadLibrary(format_dll)) == NULL)
           {
                  FreeLibrary(codecdll_handle);
                  return false;
           }

        if((utildll_handle = LoadLibrary(util_dll)) == NULL)
           {
                  FreeLibrary(codecdll_handle);
                  FreeLibrary(formatdll_handle);
                  return false;
           }


        return true;
}
//---------------------------------------------------------------------------
bool __fastcall FFmpegClose()
{
        return (FreeLibrary(codecdll_handle) && FreeLibrary(formatdll_handle) && FreeLibrary(utildll_handle));
}
//---------------------------------------------------------------------------
int __fastcall MPEGFileInfo(avFileMediaInfo &avInfo)
{
        if(!FFmpegInitialize())
           return -1;
        avRegisterAll av_register_all = (avRegisterAll)GetProcAddress(formatdll_handle, "av_register_all");
        if(av_register_all == NULL)
           return -1;
        avformatOpenInput avformat_open_input = (avformatOpenInput)GetProcAddress(formatdll_handle, "avformat_open_input");
        if(avformat_open_input == NULL)
           return -1;
        avformatFindStreamInfo avformat_find_stream_info = (avformatFindStreamInfo)GetProcAddress(formatdll_handle, "avformat_find_stream_info");
        if(avformat_find_stream_info == NULL)
           return -1;
        avformatCloseInput avformat_close_input = (avformatCloseInput)GetProcAddress(formatdll_handle, "avformat_close_input");
        if(avformat_close_input == NULL)
           return -1;
        avDumpFormat av_dump_format = (avDumpFormat)GetProcAddress(formatdll_handle, "av_dump_format");
        if(av_dump_format == NULL)
           return -1;
        avformatAllocContext avformat_alloc_context = (avformatAllocContext)GetProcAddress(formatdll_handle, "avformat_alloc_context");
        if(avformat_alloc_context == NULL)
           return -1;
        avcodecFindDecoder avcodec_find_decoder = (avcodecFindDecoder)GetProcAddress(codecdll_handle, "avcodec_find_decoder");
        if(avcodec_find_decoder == NULL)
           return -1;
        avDictGet av_dict_get = (avDictGet)GetProcAddress(utildll_handle, "av_dict_get");
        if(av_dict_get == NULL)
           return -1;


        av_register_all();
        AVFormatContext *pFormatCtx = avformat_alloc_context();
        AVCodec *codec;
        AVCodecContext *pCodecCtx;
        AVDictionaryEntry *tag = NULL;

        int aud = 0, sub = 0;
        String tmp;

        if(avformat_open_input(&pFormatCtx, avInfo.FileName.c_str(), NULL, NULL) != 0)
          return -1;

        avInfo.Streams = pFormatCtx->nb_streams;
        if(avInfo.Streams == 0)
          return 0;

        if(avformat_find_stream_info(pFormatCtx, NULL) < 0)
          return -1;

//      av_dump_format(pFormatCtx, 0, avInfo.FileName.c_str(), 0);

        for(int i = 0; i < avInfo.Streams; i++)
         {
                if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
                   pFormatCtx->streams[i]->codec->codec_id != AV_CODEC_ID_MJPEG &&
                   pFormatCtx->streams[i]->codec->codec_id != AV_CODEC_ID_MJPEGB)
                   {

                          avInfo.VideoID = i;
                          codec = avcodec_find_decoder(pFormatCtx->streams[i]->codec->codec_id);
                          pCodecCtx = pFormatCtx->streams[i]->codec;
                          tmp = String(codec->name);
                          avInfo.VideoCodecName = tmp;
                          tmp = String(codec->long_name);
                          avInfo.VideoLongCodecName = tmp;
                          avInfo.VideoHeight = pFormatCtx->streams[i]->codec->height;
                          avInfo.VideoWidth = pFormatCtx->streams[i]->codec->width;
                          avInfo.MovieDuration = pFormatCtx->duration;
                          avInfo.VideoFPS = GetVideoFPS(pFormatCtx->streams[i]->r_frame_rate.num,
                                                                                        pFormatCtx->streams[i]->r_frame_rate.den) ;
                          while((tag = av_dict_get(pFormatCtx->streams[i]->metadata, "DURATION-eng",
                                                                                         tag, AV_DICT_IGNORE_SUFFIX)) != NULL)
                                 {
                                         tmp = String(tag->value);
                                         avInfo.VideoTime = tmp.SubString(1,12);
                                 }

                   }

                else if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
                   {
                          avInfo.AudioAdd(aud, i);
                          codec = avcodec_find_decoder(pFormatCtx->streams[i]->codec->codec_id);
                          pCodecCtx = pFormatCtx->streams[i]->codec;
                          tmp = String(codec->name);
                          avInfo.AudioCodecNameSet(aud, tmp);
                          tmp = String(codec->long_name);
                          avInfo.AudioLongCodecNameSet(aud, tmp);
                          while((tag = av_dict_get(pFormatCtx->streams[i]->metadata, "language",
                                                                          tag, AV_DICT_IGNORE_SUFFIX)) != NULL)
                                 {
                                         tmp = String(tag->value);
                                         avInfo.AudioLanguageSet(aud, tmp);
                                 }
                          while((tag = av_dict_get(pFormatCtx->streams[i]->metadata, "title",
                                                                          tag, AV_DICT_IGNORE_SUFFIX)) != NULL)
                 {
                                         tmp = String(tag->value);
                                         avInfo.AudioTitleSet(aud, tmp);
                                 }
                          while((tag = av_dict_get(pFormatCtx->streams[i]->metadata, "DURATION-eng",
                                                                          tag, AV_DICT_IGNORE_SUFFIX)) != NULL)
                                 {
                                         tmp = String(tag->value);
                                         avInfo.AudioTimeSet(aud, tmp.SubString(1,12));
                                 }
                          avInfo.AudioSampleRateSet(aud, pCodecCtx->sample_rate);
                          avInfo.AudioChannelsSet(aud, pCodecCtx->channels);
                          aud++;
                   }

                else if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
                   {
                          avInfo.SubAdd(sub, i);
                          codec = avcodec_find_decoder(pFormatCtx->streams[i]->codec->codec_id);
                          pCodecCtx = pFormatCtx->streams[i]->codec;
                          tmp = String(codec->name) ;
                          avInfo.SubCodecNameSet(sub, tmp);
                          tmp = String(codec->long_name) ;
                          avInfo.SubLongCodecNameSet(sub, tmp);
                          while((tag = av_dict_get(pFormatCtx->streams[i]->metadata, "language",
                                                                          tag, AV_DICT_IGNORE_SUFFIX)) != NULL)
                 {
                                         tmp = String(tag->value);
                                         avInfo.SubLanguageSet(sub, tmp);
                                 }
                          while((tag = av_dict_get(pFormatCtx->streams[i]->metadata, "title",
                                                                          tag, AV_DICT_IGNORE_SUFFIX)) != NULL)
                 {
                                         tmp = String(tag->value);
                                         avInfo.SubTitleSet(sub, tmp);
                                 }
                          sub++;
                   }
         }

   avInfo.AudioStreams = aud;
   avInfo.SubStreams = sub;
   avformat_close_input(&pFormatCtx);
   FFmpegClose();

   return avInfo.Streams;
}
 


Dokumentacji dotyczącej użycia FFMPEG dla C++ Buildera na necie jest zero, tak że wszystko co napisałem to moja radosna twórczość, ale może ktoś mądrzejszy podpowie mi w czym może tkwić błąd, co robię nie tak ??? :|
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 37
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsChrome

Re: FFMPEG i brak stabilnoci

Nowy postprzez polymorphism » sobota, 3 sierpnia 2019, 10:47

Kilka uwag:
  • nie prościej wygenerować bibliotekę importów (implib) dla DLL-ek, zamiast ładować je dynamicznie?
  • po co w OpenBtnClick tworzysz na stercie obiekt avInfo? Przecież to lokalny obiekt. A jak już musi być sterta, to dlaczego nie używasz inteligentnych wskaźników (std::unique_ptr)?
  • kodu sporo i ciężko tak na pierwszy rzut oka znaleźć błąd, tym bardziej, że może być w innym miejscu programu. Dlatego powinieneś użyć debuggera. Jak wyskoczy błąd, użyj okna Call stack.
  • DODANE: pewny jesteś konwencji __stdcall?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: FFMPEG i brak stabilnoci

Nowy postprzez pioro700 » niedziela, 4 sierpnia 2019, 11:02

polymorphism napisał(a):nie prościej wygenerować bibliotekę importów (implib) dla DLL-ek, zamiast ładować je dynamicznie?

Najprawdopodobniej nie potrafię (nigdy nie używałem DLLi w praktyce) i mimo wielu przeczytanych źródeł nie mogę sobie poradzić z wikłaniem nazw.
Kiedy zadeklaruję :
Kod: Zaznacz cały
extern "C" {
   void __declspec(dllimport) av_register_all(void);
   int __declspec(dllimport) avformat_open_input(AVFormatContext * *ps, const char *filename, AVInputFormat * fmt,
                        AVDictionary * *options);
   int __declspec(dllimport) avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
   void __declspec(dllimport) avformat_close_input(AVFormatContext * *s);
   void  __declspec(dllimport) av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output);
   AVFormatContext* __declspec(dllimport) avformat_alloc_context(void);
   AVCodec* __declspec(dllimport) avcodec_find_decoder(AVCodecID id);
   AVDictionaryEntry* __declspec(dllimport) av_dict_et(AVDictionary *m, const char *key,
                                       const AVDictionaryEntry *prev, int  flags);
}

i dołączę pliki .lib, otrzymują błąd
Kod: Zaznacz cały
[ilink32 Error] Error: Unresolved external '_av_register_all' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external '_avformat_alloc_context' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external '_avformat_open_input' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external '_avformat_find_stream_info' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external '_avcodec_find_decoder' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external '_av_dict_get' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external '_avformat_close_input' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unable to perform link

Kiedy dołączam pliki .def, mam :
Kod: Zaznacz cały
[ilink32 Error] Fatal: Could not open Win32\Release\avcodec-58.defWin32\Release\avformat-58.defWin32\Release\avutil-56.defWin32\Release\swresample-3.def (error code 3)


Nie wiem co z tym zrobić. Mógłbyś dać jakiegoś tipsa ?? :|
polymorphism napisał(a):po co w OpenBtnClick tworzysz na stercie obiekt avInfo? Przecież to lokalny obiekt. A jak już musi być sterta, to dlaczego nie używasz inteligentnych wskaźników
std::unique_ptr)?

To jest tylko aplikacja testująca funkcje. Klasa "avFileMediaInfo" (objekt avInfo) będzie użyte zupełnie gdzie indziej.
Kiedy używałem std::unique_ptr zawsze otrzymywałem błąd pamięci, dlatego to pominąłem.
Ogólnie jest mnóstwo rzeczy użytych niby bez sensu, ale w jakiś sposób poprawiają stabilność.

polymorphism napisał(a): pewny jesteś konwencji __stdcall?

Tak.
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 37
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsChrome

Re: FFMPEG i brak stabilnoci

Nowy postprzez polymorphism » niedziela, 4 sierpnia 2019, 12:25

Kiedy zadeklaruję :

A po co deklarujesz te funkcje, skoro ich deklaracje powinny być w plikach nagłówkowych biblioteki?

i dołączę pliki .lib

Jeśli są to LIB-y dostarczone razem z biblioteką, to (chyba) nie tędy droga. Te biblioteki importów są wygenerowane dla VC++ i AFAIK C++ Builder nie jest w stanie z nich korzystać. Użyj programu implib do wygenerowania bibliotek. Pliki .def są, więc powinno pójść w miarę prosto.

Kiedy używałem std::unique_ptr zawsze otrzymywałem błąd pamięci, dlatego to pominąłem.

Błąd. std::unique_ptr to jedna z kluczowych klas C++. Unikanie inteligentnych wskaźników (czy klasy std::vector) na rzecz ręcznego zarządzania pamięcią to bardzo duży błąd.

Skąd ta pewność co do konwencji wywołania?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox

Re: FFMPEG i brak stabilnoci

Nowy postprzez pioro700 » niedziela, 4 sierpnia 2019, 13:25

polymorphism napisał(a):A po co deklarujesz te funkcje, skoro ich deklaracje powinny być w plikach nagłówkowych biblioteki?

Fakt ... wywaliłem.
polymorphism napisał(a):Jeśli są to LIB-y dostarczone razem z biblioteką, to (chyba) nie tędy droga. Te biblioteki importów są wygenerowane dla VC++ i AFAIK C++ Builder nie jest w stanie z nich korzystać. Użyj programu implib do wygenerowania bibliotek. Pliki .def są, więc powinno pójść w miarę prosto.

To są Lib'y wygenerowane przez implib (próbowałem z DLLi i z DEFów z takim samym rezultatem).
polymorphism napisał(a):Skąd ta pewność co do konwencji wywołania?

Program "Dependency Walker".

Nie rozumiem czemu po dodaniu do projektu plików DEF otrzymuję te dziwne błędy

Kod: Zaznacz cały
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/dict.h> }


kiedy usunę extern "C" otrzymuję całą listę błędów :
Kod: Zaznacz cały
[ilink32 Error] Error: Unresolved external 'av_register_all()' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external 'avformat_alloc_context()' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external 'avformat_open_input(AVFormatContext * *, const char *, AVInputFormat *, AVDictionary * *)' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external 'avformat_find_stream_info(AVFormatContext *, AVDictionary * *)' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external 'avcodec_find_decoder(AVCodecID)' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external 'av_dict_get(AVDictionary *, const char *, AVDictionaryEntry *, int)' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unresolved external 'avformat_close_input(AVFormatContext * *)' referenced from D:\C_BUILDER\FFMPEGTEST\WIN32\RELEASE\AFFMPEG.OBJ
[ilink32 Error] Error: Unable to perform link
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 37
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsChrome

Re: FFMPEG i brak stabilnoci

Nowy postprzez polymorphism » niedziela, 4 sierpnia 2019, 14:28

To są Lib'y wygenerowane przez implib (próbowałem z DLLi i z DEFów z takim samym rezultatem).

Próbowałeś z flagami dotyczącymi dodawania _ do nazw funkcji? Pamiętam z innego forum, że te podkreślniki mogą powodować w C++ Builderze problemy przy importowaniu funkcji z DLL-ek skompilowanych w innym kompilatorze.

kiedy usunę extern "C" otrzymuję całą listę błędów :

Wydaje mi się, że to powinno zostać, bo z tego, co widzę, deklaracje funkcji w nagłówkach biblioteki nie są objęte klauzulą extern "C".

Następna rzecz, która może powodować problemy to domyślna konwencja wywołania. Może być __cdecl. Biblioteka, jak twierdzisz, ma __stdcall.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox

Re: FFMPEG i brak stabilnoci

Nowy postprzez pioro700 » niedziela, 4 sierpnia 2019, 20:07

Nie mam zielonego pojęcia co może być nie tak, przejrzałem mnóstwo wątków dotyczących DLL ..
Sprawdziłem wszystko według opisu dotyczącego importu DLL VC++ do C++Buildera, choć tu może być pies pogrzebany gdyż o ile większość przykładów wykorzystania bibliotek FFMPEG dotyczy VC++, to czy same DLL kompilowane są w VC++ ??

polymorphism napisał(a):Próbowałeś z flagami dotyczącymi dodawania _ do nazw funkcji? Pamiętam z innego forum, że te podkreślniki mogą powodować w C++ Builderze problemy przy importowaniu funkcji z DLL-ek skompilowanych w innym kompilatorze.

Już próbowałem wszystkiego (https://www.tek-tips.com/viewthread.cfm?qid=1099123, ten opis jest na stronie Embarcadero) ... i nic :roll:
Nazwy funkcji sprawdzałem DMUPEem i "Dependency Walker" i są kompatybilne zarówno dla VC++ jak i dla BC++ według standardu __stdcall ... tylko jak przetłumaczyć programowi ,że są :D
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 37
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsChrome

Re: FFMPEG i brak stabilnoci

Nowy postprzez polymorphism » niedziela, 4 sierpnia 2019, 20:38

to czy same DLL kompilowane są w VC++ ??

Bardzo prawdopodobne. Powiedzmy sobie jasno: na Windowsie rządzi VC++ (jeśli mowa o C++). MinGW/clang też jest, ale z reguły jak coś jest zrobione na Windowsa, to prawie zawsze dla VC++. C++ Builder to niszowe środowisko i odkąd pamiętam zawsze były tego typu niedogodności (choć moja przygoda z CppB skończyła się na wersji 5 bodajże, czyli dawno). Jeśli się nie mylę, nowsze 64-bitowe wersje C++ Buildera stoją na backendzie clanga, który to z kolei akceptuje biblioteki z GCC (MinGW). Więc jeśli korzystasz z nowej wersji środowiska, sprawdź, czy możesz użyć bibliotek .a (bo widzę, że takowe są).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox

Re: FFMPEG i brak stabilnoci

Nowy postprzez pioro700 » niedziela, 4 sierpnia 2019, 21:45

polymorphism napisał(a):Więc jeśli korzystasz z nowej wersji środowiska, sprawdź, czy możesz użyć bibliotek .a (bo widzę, że takowe są).

A jaka jest różnica ??
Już raz próbowałem przesiąść się na VC++ ale szło mi to jak po grudzie ... przyzwyczajenia ... wiek ..
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 37
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsChrome

Re: FFMPEG i brak stabilnoci

Nowy postprzez polymorphism » poniedziałek, 5 sierpnia 2019, 10:22

Nie rozumiem, o jaką różnicę pytasz.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: FFMPEG i brak stabilnoci

Nowy postprzez pioro700 » piątek, 9 sierpnia 2019, 06:42

polymorphism napisał(a):Nie rozumiem, o jaką różnicę pytasz.

O różnicę między ".lib" i ".lib.a".
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 37
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsChrome

Re: FFMPEG i brak stabilnoci

Nowy postprzez polymorphism » piątek, 9 sierpnia 2019, 10:27

Miałeś chyba na myśli *.dll.a.

Jeśli chodzi o rozszerzenia .a i .lib, to tak jak pisałem: to pierwsze rozszerzenie jest typowe dla bibliotek kompilatorów GCC/clang, drugie - może być biblioteką VC++ (COFF) ale też C++ Builder (OMF).
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
pioro700
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: FFMPEG i brak stabilnoci

Nowy postprzez pioro700 » niedziela, 11 sierpnia 2019, 20:28

Na rosyjskim forum znalazłem pliki *.lib dla BCB dla najnowszej wersji FFMPEG (4.1.3) i nagle wszystko śmiga bez najmniejszych błędów.
Mimo przeczytanych dziesiątek artykułów dotyczących najróżniejszych konwersji, mimo dziesiątek prób, nie potrafiłem utworzyć kompatybilnych z BCB plików *.lib ... a tu nagle są :shock:
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 37
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsChrome

Re: FFMPEG i brak stabilnoci

Nowy postprzez polymorphism » poniedziałek, 12 sierpnia 2019, 10:26

No niestety, takie uroki C++ Buildera. Dlatego nie warto na siłę trzymać się tylko jednego kompilatora/IDE.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron