BITMAPINFOHEADER bitmap;
WAVEFORMATEX waveformat;
+ int audio_eof;
+ int video_eof;
+
int video_pos;
int video_end;
#define _TRACE_ {printf("vfw: %s: %d (%s)\n",__FILE__,__LINE__,__func__);fflush(stdout);}
-static bool videoreader_vfw_eof(videoreader_t* vr)
-{
- videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
- return (i->video_pos >= i->video_end);
-}
-
static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width, const int dest_height, int flip)
{
UCHAR*data = (UCHAR*)(bi+1); // actual bitmap data starts after the header
ULONG*dest = (ULONG*)buffer;
- int width = bi->biWidth;
- int height = bi->biHeight;
+ int width = abs(bi->biWidth);
+ int height = abs(bi->biHeight);
if(dest_width != width || dest_height != height) {
/* TODO: size conversion */
fprintf(stderr, "size mismatch: %dx%d != %dx%d\n", width, height, dest_width, dest_height);
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
- if(videoreader_vfw_eof(vr))
+ if (i->video_pos >= i->video_end)
+ i->video_eof = 1;
+
+ if(i->video_eof)
return 0;
LPBITMAPINFOHEADER bi;
static int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num)
{
videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
+
+ if(i->audio_eof)
+ return 0;
switch(i->waveformat.wBitsPerSample) {
case 1: {
do {
((SHORT*)buf)[t] = ((((BYTE*)buf)[t>>3])>>(t&7))<<15;
} while(--t>=0);
+ if(!len) i->audio_eof = 1;
return len*8;
}
case 8: {
do {
((SHORT*)buf)[t] = (((BYTE*)buf)[t]<<8)^0x8000;
} while(--t>=0);
+ if(!len) i->audio_eof = 1;
return len*2;
}
case 16: {
- return readAudioBlock(i, buf, num);
+ int len = readAudioBlock(i, buf, num);
+ if(!len) i->audio_eof = 1;
+ return len;
}
default: {
return 0;
memset(i, 0, sizeof(videoreader_vfw_internal_t));
vr->internal = i;
- vr->eof = videoreader_vfw_eof;
vr->getimage = videoreader_vfw_getimage;
vr->getsamples = videoreader_vfw_getsamples;
vr->close = videoreader_vfw_close;
if(1) {
i->bitmap = bitmap;
i->vs = stream;
- i->width = bitmap.biWidth;
- i->height = bitmap.biHeight;
+ i->width = abs(bitmap.biWidth);
+ i->height = abs(bitmap.biHeight);
} else {
fprintf(stderr, "Ignoring video stream: %dx%d compression=%d planes=%d\n",
- bitmap.biWidth, bitmap.biHeight,
+ abs(bitmap.biWidth), abs(bitmap.biHeight),
bitmap.biCompression,bitmap.biPlanes);
}
}