Hi, 

Sorry I forget I should send plain text email so my previous email is totally 
cannot be read. 
Here is my question. I try to make rtsp work with osg quicktime plugin. 
According one user's idea, I make 
some change in qt plugin as follows:
1. I add load movie from url: 

if (CFURLRef urlRef = CFURLCreateWithBytes(NULL, (const UInt8 *)url, 
strlen(url), kCFStringEncodingUTF8, NULL)) { 
                        Handle  dataRef;
                        OSType  dataRefType;
                        error = QTNewDataReferenceFromCFURL(urlRef, 0, 
&dataRef, &dataRefType); 
                        if (error == noErr) {
                                error = NewMovieFromDataRef(movie, 
newMovieIdleImportOK, NULL, dataRef, dataRefType); 
                                error = GetMoviesError();
                        }
                        
                        CFRelease(urlRef);
                }

2. 2. open it with a function as prepreroolMovie ( quicktime api said this is 
required for streaming): 

err = MakeMovieFromURL(filename.c_str(),&_movie);
                // add prepreroll
                
                err = PrePrerollMovie(_movie, 0, GetMoviePreferredRate(_movie),
                                                                
NewMoviePrePrerollCompleteProc(MovieData::MoviePrePrerollCompleteProc),
                                                          (void *)this); 

<< here get problem, if http, it is ok, but rtsp PrePrerollMovie() will return 
-1.  
What I cannot understand is: I implement this with glut and it never get an 
error. 


// simpleQTtest.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "simpleQTtest.h"
#include <GL/glew.h>

#include <glvu.hpp>
#include <ppm.hpp>

#include <GL/glut.h>

#include "QTML.h"
#include "Movies.h"
#include "ImageCompression.h"
#include "MacErrors.h"


GLVU glvu;

#define MAX_LOADSTRING 100


Movie theMovie;

Rect box;

GLuint textureUnit; 
unsigned char *image; 
int width, height;

void userDisplayFunc0()
{
  glvu.BeginFrame();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //glColor3f(1,0,0);
    //glutSolidTorus(0.25,1,32,64);
        glEnable(GL_TEXTURE_2D); 
        glBindTexture(GL_TEXTURE_2D, textureUnit); 
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGRA, 
GL_UNSIGNED_INT_8_8_8_8_REV,image); 


        glBegin(GL_QUADS); 
                        glTexCoord2d(0.0, 0.0);         glVertex3d(-0.5, -0.5, 
0); 
                        glTexCoord2d(0.0, 1.0);         glVertex3d(-0.5, 0.5, 
0); 
                        glTexCoord2d(1.0, 1.0);         glVertex3d(0.5, 0.5, 
0); 
                        glTexCoord2d(1.0, 0.0);         glVertex3d(0.5, -0.5, 
0); 
        glEnd(); 
  glvu.EndFrame();
}


void loadPPMImage()
{
  
   LoadPPM("sample.ppm", image, width, height);  
}

void UpdateMovieGWorld(Movie m)
{
        CGrafPtr port;
        GDHandle dev;
        GetMovieGWorld(m,&port,&dev);

        Rect box;
        GetMovieNaturalBoundsRect(m,&box);

        MacOffsetRect (&box, -box.left, -box.top);
        SetMovieBox (m, &box);

        int width=box.right;
        int height=box.bottom;

        GWorldPtr movieGWorld;
        void* pixels=malloc(width*height*4);

        
NewGWorldFromPtr(&movieGWorld,k32BGRAPixelFormat,&box,0,0,0,(Ptr)pixels,width*4);

        SetMovieGWorld (m, (CGrafPtr)movieGWorld, nil);

        if (port && !dev)
        {
                pixels=port->portPixMap[0]->baseAddr;
                DisposeGWorld(port);
                free(pixels);
        }
}

void MyMoviePrePrerollCompleteProc(Movie theMovie, OSErr prerollErr,
                                                                   void *refcon)
{
        Fixed rate=GetMoviePreferredRate(theMovie);
        //PrerollMovie(theMovie,0,rate);
        SetMovieRate(theMovie,rate);
        StartMovie(theMovie);
}

OSErr MyMovieDrawingCompleteProc(Movie theMovie, long refCon)
{
        

        CGrafPtr port;
        GDHandle dev;
        GetMovieGWorld(theMovie,&port,&dev);

        char* pixels=port->portPixMap[0]->baseAddr;
        int pixels_width=port->portPixMap[0]->bounds.right;
        int pixels_height=port->portPixMap[0]->bounds.bottom;


        image = (unsigned char *) pixels; 
        width = pixels_width; 
        height = pixels_height; 
        userDisplayFunc0();     

        return noErr;
}


bool LoadMovieFromPath(Movie* m, const char* thePath)
{
        char fullpath[255];
        strcpy(fullpath,thePath);
        c2pstr(fullpath);

        short theFile = 0;
        FSSpec sfFile;

        FSMakeFSSpec (0, 0L, (ConstStr255Param)fullpath, &sfFile);

        int err=OpenMovieFile (&sfFile, &theFile, fsRdPerm);
        if (err!=noErr)
                return false;

        err=NewMovieFromFile (m, theFile, nil, nil, newMovieActive,
                nil);

        CloseMovieFile (theFile);

        if (err!=noErr)
                return false;

        UpdateMovieGWorld(*m);

        MyMoviePrePrerollCompleteProc(*m,0,0);

        return true;
}

bool LoadMovieFromURL(Movie* m, const char* url)
{
        
        OSStatus  error = memFullErr;
        if (CFURLRef urlRef = CFURLCreateWithBytes(NULL, (const UInt8 *)url, 
strlen(url), kCFStringEncodingUTF8, NULL)) { 
                Handle  dataRef;
                OSType  dataRefType;
                error = QTNewDataReferenceFromCFURL(urlRef, 0, &dataRef, 
&dataRefType); 
                if (error == noErr) 
                        error = NewMovieFromDataRef(m, newMovieActive | 
newMovieAsyncOK, NULL, dataRef, dataRefType); 
                CFRelease(urlRef);
        }

        

        //SetMovieDrawingCompleteProc(*m, movieDrawingCallWhenChanged,  
        //       MyMovieDrawingCompleteProc, 0 /*refCon*/);//,

        /*SetMoviePlayHints(*m, hintsAllowDynamicResize,
                hintsAllowDynamicResize);*/
        Fixed rate = GetMoviePreferredRate(*m); 

        error=PrePrerollMovie(*m, 0, GetMoviePreferredRate(*m),
                NewMoviePrePrerollCompleteProc(MyMoviePrePrerollCompleteProc), 
//,
                (void *)0L);


        UpdateMovieGWorld(*m);

        

        
    return true;



}






void idle0()
{
        if(!IsMovieDone(theMovie))
        {
        Rect r;
        GetMovieNaturalBoundsRect(theMovie,&r);
        if (r.right!=box.right || r.bottom!=box.bottom)
        {
                box.right=r.right;
                box.bottom=r.bottom;
                UpdateMovieGWorld(theMovie);
        }


        
        MoviesTask (theMovie, 0);

    CGrafPtr port;
        GDHandle dev;
        GetMovieGWorld(theMovie,&port,&dev);

        char* pixels=port->portPixMap[0]->baseAddr;
        int pixels_width=port->portPixMap[0]->bounds.right;
        int pixels_height=port->portPixMap[0]->bounds.bottom;


        image = (unsigned char *) pixels; 
        width = pixels_width; 
        height = pixels_height; 
    userDisplayFunc0(); 




        Sleep(1);
        }

}

void initTexture()
{
        loadPPMImage(); // read image first. 
        glGenTextures(1, &textureUnit);
        glBindTexture(GL_TEXTURE_2D, textureUnit);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, 
GL_UNSIGNED_BYTE,image); 
        glBindTexture(GL_TEXTURE_2D, 0); 
}

// just leave one main function here then add glvu 

int main()
{
        
        OSErr err;
        err = InitializeQTML(0);//

        err = EnterMovies ();

        // check ver
        long version;
        OSErr result;

        result = Gestalt(gestaltQuickTime,&version);
        if ((result == noErr) && (version >= 0x05020000))
        {
                /* we have version 5.0.2 or later */
        }
        else
                return 0;

        // get the movie from url or file path
        

        const char* url="rtsp://141.161.16.105:554/igp/isip2of5011206.mov";
        
        if (!LoadMovieFromURL(&theMovie,url))
                return 0;

        //SetMovieDrawingCompleteProc(theMovie,movieDrawingCallWhenChanged,   
MyMovieDrawingCompleteProc, 0/*refCon*/);

        
        Rect box2; 
        GetMovieNaturalBoundsRect(theMovie,&box);

        GetMovieBox(theMovie, &box2); 

        SetMovieRate(theMovie, 0); 

        float timeScale = GetMovieTimeScale(theMovie); 
        DWORD bias=GetTickCount();





        glvu.Init("Quicktime Basic Example",
                GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA,
                50,50,512,512);

        GLenum erra = glewInit();
        if (GLEW_OK != erra)
        {
                /* Problem: glewInit failed, something is seriously wrong. */
                ///fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
                //...
        }



        //glEnable(GL_LIGHTING);
        //glEnable(GL_LIGHT0);
        //glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_DEPTH_TEST);

        initTexture(); 

        glutDisplayFunc(userDisplayFunc0);
        glutIdleFunc(idle0); 

        Vec3f ModelMin(-1,-1,-1), ModelMax(1,1,1); 
        Vec3f LookAtCntr( ModelMin+ModelMax ); LookAtCntr*=0.5;
        Vec3f mintoCtr( LookAtCntr - ModelMin );
        Vec3f Up(0,1,0);
        Vec3f Eye(LookAtCntr - 3*(mintoCtr - Up * (mintoCtr * Up) ));
        float Yfov = 45;
        float Aspect = 1;     // WIDTH OVER HEIGHT
        float Near = 0.1f;    // NEAR PLANE DISTANCE RELATIVE TO MODEL DIAGONAL 
LENGTH
        float Far = 10.0f;    // FAR PLANE DISTANCE (ALSO RELATIVE)
        glvu.SetAllCams(ModelMin,ModelMax, Eye,LookAtCntr,Up, Yfov,Aspect, 
Near,Far);

        
//--------------------------------------------------------------------------
        // (3) start the viewer event loop.
        
//--------------------------------------------------------------------------

        glutMainLoop();




        return 0; 
}


you can see I use exactly same code, but at here the function:
error=PrePrerollMovie(*m, 0, 
GetMoviePreferredRate(*m),NewMoviePrePrerollCompleteProc(MyMoviePrePrerollCompleteProc),
 //,(void *)0L);
<< never return -1 error. 
<< beside, this example cannot make "http" working because of buffer conflict 
but 
<< that is another issue.  
I check the qt plugin code, looks nothing can affect the PrePrerollMovie 
function, 
So, why rtsp cannot work with osg? 
There is some setting in loadURL like: newMovieIdleImportOK and newMovieActive 
| newMovieAsyncOK, but even I change it still doesn't work.  
Since I am not familiar with quicktime API, it really confused me. 

Thanks for any help.  


Hui 




      
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to