fixed compile-time bug.
[swftools.git] / avi2swf / videoreader_vfw.cc
index b809eb0..124284a 100644 (file)
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
+#include "videoreader.h"
 #ifdef WIN32
 #include <windows.h>
 #include <vfw.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include "videoreader.h"
 
 typedef struct _videoreader_vfw_internal { 
     //video:
@@ -49,19 +49,20 @@ typedef struct _videoreader_vfw_internal {
     int samplerate;
     int channels;
 
+    int flip;
 } videoreader_vfw_internal_t;
 
 static int avifile_initialized = 0;
 
 #define _TRACE_ {printf("%s: %d (%s)\n",__FILE__,__LINE__,__func__);fflush(stdout);}
 
-bool videoreader_vfw_eof(videoreader_t* vr)
+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)
+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
 
@@ -87,10 +88,15 @@ static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
     int bytesperpixel = ((bi->biWidth*bi->biBitCount)+7)&~7;
     int linex = ((bytesperpixel/8)+3)&~3;
     memset(dest, 255, dest_width*dest_height*4);//pre-fill alpha channel
+
+    int starty = flip? 0 : dest_height-1;
+    int endy   = flip? dest_height-1 : 0;
+    int yinc   = flip? 1 : -1;
+
     if(bi->biBitCount==1) {
-       int y;
        UCHAR*img = data;
-       for(y=0;y<dest_height;y++) {
+       int y;
+       for(y=starty;y<=endy;y+=yinc) {
            UCHAR*line = &img[linex*y];
            int x;
            for(x=0;x<dest_width;x++) {
@@ -98,10 +104,10 @@ static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
            }
        }
     } else if(bi->biBitCount==4) {
-       int y;
        UCHAR*img = &data[bi->biClrUsed*4];
        UCHAR*pal = data;
-       for(y=0;y<dest_height;y++) {
+       int y;
+       for(y=starty;y<=endy;y+=yinc) {
            UCHAR*line = &img[linex*y];
            int x;
            for(x=0;x<dest_width/2;x++) {
@@ -111,10 +117,10 @@ static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
            }
        }
     } else if(bi->biBitCount==8) {
-       int y;
        UCHAR*img = &data[bi->biClrUsed*4];
        UCHAR*pal = data;
-       for(y=0;y<dest_height;y++) {
+       int y;
+       for(y=starty;y<=endy;y+=yinc) {
            UCHAR*line = &img[linex*y];
            int x;
            for(x=0;x<dest_width;x++) {
@@ -125,7 +131,7 @@ static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
     } else if(bi->biBitCount==24) {
        UCHAR*img = data;
        int y;
-       for(y=0;y<dest_height;y++) {
+       for(y=starty;y<=endy;y+=yinc) {
            UCHAR*line = &img[linex*y];
            int x;
            for(x=0;x<dest_width;x++) {
@@ -136,7 +142,7 @@ static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
     } else if(bi->biBitCount==32) {
        UCHAR*img = data;
        int y;
-       for(y=0;y<dest_height;y++) {
+       for(y=starty;y<=endy;y+=yinc) {
            UCHAR*line = &img[linex*y];
            int x;
            for(x=0;x<dest_width;x++) {
@@ -151,7 +157,7 @@ static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width
     return 1;
 }
 
-int videoreader_vfw_getimage(videoreader_t* vr, void*buffer)
+static int videoreader_vfw_getimage(videoreader_t* vr, void*buffer)
 {
     videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
 
@@ -162,13 +168,14 @@ int videoreader_vfw_getimage(videoreader_t* vr, void*buffer)
     bi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(i->getframe, i->video_pos);
        
     i->video_pos++;
+    vr->frame++;
 
     if(!bi) {
        fprintf(stderr, "AVIStreamGetFrame failed\n");
        return 0;
     }
     
-    if(!bitmap_to_rgba(bi, buffer, i->width, i->height)) {
+    if(!bitmap_to_rgba(bi, buffer, i->width, i->height, i->flip)) {
        fprintf(stderr, "couldn't convert bitmap to RGBA.\n");
        return 0;
     }
@@ -184,7 +191,7 @@ static int readAudioBlock(videoreader_vfw_internal_t* i, void*buf, int len)
     return bytes;
 }
 
-int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num)
+static int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num)
 {
     videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
    
@@ -214,7 +221,7 @@ int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num)
     }
 }
 
-void videoreader_vfw_close(videoreader_t* vr)
+static void videoreader_vfw_close(videoreader_t* vr)
 {
     videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
 
@@ -232,7 +239,13 @@ void videoreader_vfw_close(videoreader_t* vr)
     free(vr->internal); vr->internal = 0;
 }
 
-void videoreader_vfw_setparameter(videoreader_t* vr, char*name, char*value) {}
+static void videoreader_vfw_setparameter(videoreader_t*vr, char*name, char*value)
+{
+    videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal;
+    if(!strcmp(name, "flip")) {
+       i->flip = atoi(value);
+    }
+}
 
 int videoreader_vfw_open(videoreader_t* vr, char* filename)
 {
@@ -330,6 +343,7 @@ int videoreader_vfw_open(videoreader_t* vr, char* filename)
     
     i->getframe = AVIStreamGetFrameOpen(i->vs, 0);
     if(!i->getframe) {
+       fprintf(stderr, "Couldn't initialize AVIStream for %s- codec missing?\n", filename);
        return -1;
     }