1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
// ON EFFECTUE UNE FASTCOMPRESSION
PAVISTREAM pAvi;
PGETFRAME pGetFrame;
void *pDIB; // Pointeur sur le packet DIB
void *dataOut; // Pointeur sur donnée résultats
int j; // Compteur nombre de frames
BITMAPINFOHEADER *bih = (BITMAPINFOHEADER *) AVIGETFRAMEF_BESTDISPLAYFMT;
BITMAPINFOHEADER bihe;
int nb_frames;
unsigned long retour;
// Ouvre le fichier source
if ( AVIStreamOpenFromFile( &pAvi, FileName.c_str(), streamtypeVIDEO,
0, NULL, OF_READ ) != 0 )
return -1; // Erreur à l'ouverture du fichier
// Récupère le nombre de frames du fichier
nb_frames = AVIStreamLength( pAvi );
if (nb_frames == -1)
return -6;
// Alloue le buffer de données résultat & initialisation format de sortie
dataOut = static_cast <void*> ( new char[OUT_BUFFER_SIZE] );
bihe.biSizeImage = OUT_BUFFER_SIZE;
bihe.biSize = sizeof ( BITMAPINFOHEADER );
bihe.biBitCount =
// Tant qu'il y a encore des frames dans le fichier source
for ( j = 0 ; j < nb_frames; ++j )
{
// Récupérer la frame du fichier
pGetFrame = AVIStreamGetFrameOpen( pAvi, bih );
if ( pGetFrame == NULL )
return -2; // Erreur impossible de décoder
pDIB = AVIStreamGetFrame( pGetFrame, j );
if ( pDIB == NULL )
return -3; // Erreur impossible de récupérer l'image
// Encoder la frame en XviD
// Si Keyframe, pas besoin de la frame d'avant
// KeyFrame = 1 frame sur 25
if ( j % 25 == 0 )
{
if ( ICCompress( hCodec, ICCOMPRESS_KEYFRAME , &bihe, dataOut, bih,
pDIB, 0, &retour, j, 0, 0, NULL, NULL ) != ICERR_OK )
return -4;
} else
{
if ( ICCompress( hCodec, 0 , &bihe, dataOut, bih, pDIB, 0,
&retour, j, 0, 0, NULL, NULL ) != ICERR_OK )
return -5;
}
} // Fin tant que |
Partager