X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=avi2swf%2Fvideoreader_vfw.cc;h=91555e1862cc568d26e4ab7efd00cc4b9a723e4e;hb=559f612b3997098648af09b1cfdc95c61e1e2877;hp=a5d2483322ebb7f6d140746ac46157986a086cf4;hpb=f6a3cc71c731c0144b1e137d1bdbe24afdc1c755;p=swftools.git diff --git a/avi2swf/videoreader_vfw.cc b/avi2swf/videoreader_vfw.cc index a5d2483..91555e1 100644 --- a/avi2swf/videoreader_vfw.cc +++ b/avi2swf/videoreader_vfw.cc @@ -37,6 +37,9 @@ typedef struct _videoreader_vfw_internal { BITMAPINFOHEADER bitmap; WAVEFORMATEX waveformat; + int audio_eof; + int video_eof; + int video_pos; int video_end; @@ -57,12 +60,6 @@ static int verbose; #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 @@ -133,6 +130,18 @@ static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width line++; } } + } else if(bi->biBitCount==16) { + UCHAR*img = data; + int y; + for(y=starty;y!=endy;y+=yinc) { + UCHAR*line = &img[linex*y]; + int x; + for(x=0;x>5&0x1f)<<(16+3)|(c>>10&0x1f)<<(8+3); + line+=2; + } + } } else if(bi->biBitCount==24) { UCHAR*img = data; int y; @@ -166,7 +175,10 @@ static int videoreader_vfw_getimage(videoreader_t* vr, void*buffer) { 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; @@ -199,6 +211,9 @@ static int readAudioBlock(videoreader_vfw_internal_t* i, void*buf, int len) 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: { @@ -207,6 +222,7 @@ static int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num) 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: { @@ -215,10 +231,13 @@ static int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num) 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; @@ -266,7 +285,6 @@ int videoreader_vfw_open(videoreader_t* vr, char* filename) 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;