[C++ BCB6] ICOpen - nie znajduje kompresora

0

Witam,

Mam problem z funkcją ICOpen. Mam jakieś tam filmy w avi. MediaPlayer bez problemu je otwiera. We właściwościach pliku w MP w polu Koder-dekoder najpierw nie było nic. Więc pewnie przez DirectShow szło. Zainstalowałem kodeki K_Lite'a i teraz pokazuje ffdshow. A ICOpen dalej zwraca mi NULL'a.

Z video, AVI.. to mój pierwszy program.

A, ICInfo też mi nie działa - ujęte w /**/ w kodzie.

Globalne zmienne:

PAVIFILE pfile;
PAVISTREAM  avistr;
unsigned int ulDlugosc;

Funkcja otwierająca plik AVI

bool OtworzPlik(char * xplik){

    LONG hres;
    AVIFileInit();          // opens AVIFile library

    hres = AVIFileOpen(&pfile, xplik, OF_READ/*OF_SHARE_DENY_WRITE*/, 0L);
    if (hres != 0){
        return false;
    }
    
    if(AVIFileGetStream(pfile, &avistr, streamtypeVIDEO, 0) != AVIERR_OK){
        if(pfile)
            AVIFileRelease(pfile);
        return false;
    }

    AVIFILEINFO fileinfo;
    if(AVIFileInfo(pfile, &fileinfo, sizeof(AVIFILEINFO))){
        return false;
    }    
    ulDlugosc = fileinfo.dwLength;

    return true;
}

Funkcja zapisująca klatki AVI do podanej lokalizacji:

bool Klatki_NaDyskSkompresowane(char * xplikout, TProgressBar * xprogr){

    BITMAPINFOHEADER * bif;
    AnsiString plik;

    unsigned long ile = ulDlugosc;
    xprogr->Position = 0;
    xprogr->Max = ulDlugosc;

    int ioffset = 0;
    HBITMAP hBmp;
    HDC hdc = CreateDC("DISPLAY", 0, 0, 0);
    Graphics::TBitmap* nowaBmp = new Graphics::TBitmap();
    if(!nowaBmp || !hdc){
        ShowMessage("Brak pamieci");
        return false;
    }

    bool res = true;
    AVISTREAMINFO info;
    if(AVIStreamInfo(avistr, &info, sizeof(AVISTREAMINFO)) == 0){
        //char b[40];
        LONG size;
        /*ICINFO icnf;
        if(ICInfo(info.fccType, info.fccHandler, &icnf)){
            AnsiString co = (AnsiString)icnf.szName + " " + (AnsiString)icnf.szDescription;
            ShowMessage(co);
        }*/

        if(AVIStreamReadFormat(avistr, 0, 0, &size)==0){
            bif =(BITMAPINFOHEADER*)new (nothrow) BYTE[size];
            if(AVIStreamReadFormat(avistr, 0, (void*)bif, &size)==0){
                long bpl = ScanBytes(bif->biWidth, bif->biBitCount);
                long maxSize = bpl * bif->biHeight;
                BYTE * buffer = new BYTE[maxSize];
                LONG read;
                LONG nSample;
                HIC hic = ICOpen(mmioFOURCC('V','I','D','C'), info.fccHandler, ICMODE_DECOMPRESS);
                if(hic){
                    BITMAPINFO * binfo;
                    BYTE * dBuffer = new (nothrow) BYTE[maxSize];
                    if(!dBuffer){
                        ShowMessage("Brak pamieci");
                        return false;
                    }

                    for(unsigned long i = 0; i < ulDlugosc; i++){
                        if(AVIStreamRead(avistr, i, 1, buffer, maxSize, &read, &nSample)==0){
                            binfo = (BITMAPINFO*)bif;
                            BITMAPINFOHEADER * dHeader=(BITMAPINFOHEADER*)new (nothrow) BYTE[size];
                            MoveMemory((BYTE*)dHeader, (BYTE*)bif, size);
                            dHeader->biCompression=BI_RGB;
                            //memset(dBuffer, 0, maxSize); // blad - dlaczego??

                            if(ICDecompress(hic, ICDECOMPRESS_HURRYUP, bif, buffer, dHeader, dBuffer)==ICERR_OK){
                                hBmp = CreateDIBitmap(hdc, dHeader, CBM_INIT, dBuffer, (BITMAPINFO*)dHeader, DIB_RGB_COLORS);
                                if(hBmp){
                                    nowaBmp->Handle = hBmp;
                                    plik = xplikout;
                                    if(i < 1000){
                                        plik += "0";
                                    }
                                    if(i < 100){
                                        plik += "0";
                                    }
                                    if(i < 10){
                                        plik += "0";
                                    }
                                    plik += IntToStr(i) + ".bmp";
                                    nowaBmp->SaveToFile(plik);
                                    DeleteObject(hBmp);
                                    hBmp = 0;
                                    xprogr->Position = i + 1;
                                }else{
                                    res = false;
                                    ShowMessage("6");
                                    break;
                                }
                            }else{
                                res = false;
                                ShowMessage("decompress");
                                break;
                            }
                            delete [] dBuffer;
                            delete (BYTE*)dHeader;

                        }else{
                            res = false;
                            ShowMessage("5");
                            break;
                        }
                    }
                }else{
                    res = false;
                    ShowMessage("4");
                }
                ICClose(hic);
                delete buffer;
            }else{
                res = false;
                ShowMessage("3");
            }
            delete (BYTE*)bif;
        }else{
            res = false;
            ShowMessage("2");
        }
    }else{
        res = false;
        ShowMessage("1");
    }

    AVIStreamRelease(avistr);

    return res;
}

Ma ktoś jakiś pomysł?

Szukałem, googliłem..

0

Sprawdziłem na drugim kompie i też ICOpen zwraca nulla.

Ale chyba temat nie jest popularny.. :]

0

ta funkcja sprawdza czy istnieje kodek i wyświetli komunikat.
jak było brak xvid to błąd wyskakiwał mi przy otwarzaniu filmu.

void __fastcall TForm1::Button6Click(TObject Sender)
{
HIC h;
/
Open a compressor with combinations of lowercase
* and uppercase compressortype and handler.
*/
h = ICOpen(mmioFOURCC('v','i','d','c'),mmioFOURCC('m','s','v','c'),ICMODE_DECOMPRESS);
if ( 0!=h)
{
Form1->Edit6->Text = "Kodek istnieje (vidc.msvc)";
}
h = ICOpen(mmioFOURCC('v','i','d','c'),mmioFOURCC('x', 'v', 'i', 'd'),ICMODE_DECOMPRESS);
if ( 0!=h)
{
Form1->Edit7->Text = "Kodek istnieje (vidc.xvid)";
}
h = ICOpen(mmioFOURCC('v','i','d','c'),mmioFOURCC('D','I','V','X'),ICMODE_DECOMPRESS);
if ( 0!=h)
{
Form1->Edit8->Text = "Kodek istnieje (vidc.divx)";
}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1