uint32_t getPicSize(void)
{
uint32_t size;
         AVDMGenericVideoStream *last;
                last=getLastVideoFilter();
                size=last->getInfo()->width*last->getInfo()->height;
        
                return size;
}
Ejemplo n.º 2
0
uint32_t getPicSize(void)
{
#warning FIXME
return 720*576;
#if 0
uint32_t size;
         AVDMGenericVideoStream *last;
                last=getLastVideoFilter();
                size=last->getInfo()->width*last->getInfo()->height;

                return size;
#endif
}
Ejemplo n.º 3
0
/**
        \fn     filtermainWindow::partial( bool b)
        \brief  Partialize one filter
*/
void filtermainWindow::partial( bool b)
{
  printf("partial\n"); 
   QListWidgetItem *item=activeList->currentItem();
   if(!item)
   {
      printf("No selection\n");
      return;
   }
    
     int itag=item->type();
     ADM_assert(itag>ACTIVE_FILTER_BASE);
     itag-=ACTIVE_FILTER_BASE;
     /* Filter 0 is the decoder ...*/
      printf("Rank : %d\n",itag); 
      ADM_assert(itag);
     
        AVDMGenericVideoStream *replace;
        CONFcouple *conf;
        conf = videofilters[itag].conf;
        if (videofilters[itag].tag == VF_PARTIAL_FILTER)	// cannot recurse
        {
            GUI_Error_HIG (QT_TR_NOOP("The filter is already partial"), NULL);
            return;
        }

        replace =new ADMVideoPartial (videofilters[itag - 1].
                                      filter,
                                      videofilters[itag].tag,
                                      conf);
        
        if(replace->configure (videofilters[itag - 1].filter))
        {
            delete videofilters[itag].filter;
            if (conf) delete conf;
            videofilters[itag].filter = replace;
            replace->getCoupledConf (&conf);
            videofilters[itag].conf = conf;
            videofilters[itag].tag = VF_PARTIAL_FILTER;
            getFirstVideoFilter ();
            buildActiveFilterList ();
			setSelected(itag);
        }
        else delete replace;
}
Ejemplo n.º 4
0
uint8_t ADMVideoFlipV::getFrameNumberNoAlloc(uint32_t frame,
				uint32_t *len,
   				ADMImage *data,
				uint32_t *flags)
{

	if (frame>= _info.nb_frames)
		return 0;
	// read uncompressed frame
	if (!_in->getFrameNumberNoAlloc(frame, len, _uncompressed, flags))
		return 0;

	uint8_t *in, *out;
	uint32_t stride=_info.width;
	uint32_t h=_info.height;
	uint32_t page, qpage;

	page=stride*h;
	qpage=page>>2;

	in=YPLANE(_uncompressed);
	out=YPLANE(data)+(h-1)*stride;
	// flip y
	for (uint32_t y=h; y>0; y--) 
	{
		memcpy(out,in,stride);
		in+=stride;
		out-=stride;
	}
	// Flip U & V			         
	stride>>=1;
	in=UPLANE(_uncompressed);
	out=UPLANE(data)+qpage-stride;
	// flip u
	for (uint32_t y=h>>1; y>0; y--) 
	{
		memcpy(out,in,stride);
		in+=stride;
		out-=stride;
	}
	in=VPLANE(_uncompressed);
	out=VPLANE(data)+qpage-stride;

	// flip u
	for (uint32_t y=h>>1; y>0; y--)
	{
		memcpy(out,in,stride);
		in+=stride;
		out-=stride;
	}
	data->copyInfo(_uncompressed);
	return 1;
}
Ejemplo n.º 5
0
uint8_t DIA_particle (AVDMGenericVideoStream *in,
                      ADMVideoParticle * particlep,
                      PARTICLE_PARAM * param,
                      const MenuMapping * menu_mapping,
                      uint32_t menu_mapping_count)
{
    // Allocate space for preview video
    uint32_t width = in->getInfo()->width;
    uint32_t height = in->getInfo()->height;

    dialog = create_particle_dialog();

	gtk_dialog_set_alternative_button_order(GTK_DIALOG(dialog),
								GTK_RESPONSE_OK,
								GTK_RESPONSE_CANCEL,
								-1);
    gtk_register_dialog (dialog);
    gtk_window_set_title (GTK_WINDOW (dialog),
                          QT_TR_NOOP("Particle Analysis Configuration"));
    gtk_widget_show (dialog);	

    // Fix up a bunch of things that Glade can't do.  This is less efficient
    // than just editing the Glade output, but it's not that big a deal and
    // doing it this way makes it MUCH easier to use Glade to tweak the layout
    // later.

    // actually, nothing to fix up in this one.  But if there ever is, this is
    // the place to do it...

    flyParticle * myDialog
        = new flyParticle (width, height, in,
                           WID(previewVideo), WID(previewSlider),
                           GTK_DIALOG(dialog), particlep, param,
                           menu_mapping, menu_mapping_count);

    g_signal_connect (GTK_OBJECT (WID(previewVideo)), "configure-event",
                      GTK_SIGNAL_FUNC (preview_video_configured),
                      gpointer (myDialog));

    myDialog->upload();
    myDialog->sliderChanged();

    g_signal_connect (GTK_OBJECT(WID(outputFileBrowseButton)), "clicked",
                      GTK_SIGNAL_FUNC(browse_button_clicked),
                      gpointer(myDialog));

    // update things when settings are changed
#define CNX(_widg,_signame) \
    g_signal_connect (GTK_OBJECT(WID(_widg)), _signame,                \
                      GTK_SIGNAL_FUNC(gui_update), gpointer(myDialog));

    CNX (minAreaSpinButton, "value_changed");
    CNX (maxAreaSpinButton, "value_changed");
    CNX (leftCropSpinButton, "value_changed");
    CNX (rightCropSpinButton, "value_changed");
    CNX (topCropSpinButton, "value_changed");
    CNX (bottomCropSpinButton, "value_changed");

    g_signal_connect (GTK_OBJECT(WID(previewSlider)), "value_changed",
                      GTK_SIGNAL_FUNC(frame_changed), gpointer(myDialog));
    g_signal_connect (GTK_OBJECT(WID(previewVideo)), "expose_event",
                      GTK_SIGNAL_FUNC(gui_draw), gpointer(myDialog));

    g_signal_connect (GTK_OBJECT(WID(previewVideo)), "button_press_event",
                      GTK_SIGNAL_FUNC(previewButtonEvent),
                      gpointer(myDialog));
#if 0
    g_signal_connect (GTK_OBJECT(WID(previewVideo)), "motion_notify_event",
                      GTK_SIGNAL_FUNC(previewMotionEvent),
                      gpointer(myDialog));
#endif

    GtkWidget * previewOutputMenu = WID(previewOutputMenu);
    uint32_t filter_count;
    FILTER * filters = getCurrentVideoFilterList (&filter_count);
    int32_t active = -1;

    // The " + (active < 0)" below is a bit of a hack.  We know that in
    // on_action() in gui_filtermanager.cpp, case A_ADD, the new filter-to-be
    // is added to the filter list without incrementing nb_active_filter yet.
    // So if we get to the end of the list and haven't yet found the filter
    // that we're configuring, we know it's a new one and therefore that it is
    // one past the apparent end of the list.  It's not a clean solution, but
    // it seems like the cleanEST solution.

    for (uint32_t i = 0; i < filter_count + (active < 0); i++)
    {
        const char * name
            = (i == 0) ? "(input)" : filterGetNameFromTag (filters [i].tag);
        bool free_name = false;
                                   
        FILTER * filter = filters + i;
        AVDMGenericVideoStream * source = filter->filter;
        uint32_t w = source->getInfo()->width;
        uint32_t h = source->getInfo()->height;
        if (w != width || h != height)
        {
            name = g_strconcat ("XX ", name, " XX", NULL);
            free_name = true;
        }

        printf ("filter [%d] = %s (%d) @ %p; %dx%d\n",
                i, name, filter->tag, source, w, h);
        gtk_combo_box_append_text (GTK_COMBO_BOX (previewOutputMenu), name);
        if (filter->filter == myDialog->getSource())
        {
            gtk_combo_box_set_active (GTK_COMBO_BOX (previewOutputMenu), i);
            printf ("\tfilter [%d] is being configured now\n", i);
            active = i;
        }

        if (free_name)
            g_free (const_cast <char *> (name));
    }

    ADM_assert (active >= 0);
    myDialog->this_filter_index = active;

    g_signal_connect (GTK_OBJECT(previewOutputMenu), "changed",
                      GTK_SIGNAL_FUNC(previewOutputMenuChange),
                      gpointer(myDialog));

    uint8_t ret = 0;
    int response = gtk_dialog_run(GTK_DIALOG(dialog));

    if (response == GTK_RESPONSE_OK)
    {
        myDialog->download();
        myDialog->pushParam();
        ret = 1;
    }
    else
        myDialog->restoreParam();

    gtk_unregister_dialog(dialog);
    gtk_widget_destroy(dialog);

    delete myDialog;

    return ret;
}
//
// One of the button of the main dialog was pressed
// Retrieve also the associated filter and handle
// the action
//______________________________________________________
void on_action (gui_act action)
{
    uint32_t action_parameter;
    VF_FILTERS tag = VF_INVALID;

    action_parameter = 0;
    if (nb_active_filter > 1)
        if (getSelectionNumber(nb_active_filter - 1,
                                WID(treeview0),
                                stores[0],
                                &action_parameter))
            action_parameter++;

    switch (action)
    {

    case A_ADD:
        tag = getFilterFromSelection();
        if (tag == VF_INVALID) break;
        CONFcouple *coup;
        videofilters[nb_active_filter].filter =
            filterCreateFromTag (tag, NULL, videofilters[nb_active_filter - 1].filter);
        videofilters[nb_active_filter].tag = tag;
        if(!videofilters[nb_active_filter].filter->
                    configure (videofilters[nb_active_filter - 1].filter))
        {
            delete videofilters[nb_active_filter].filter;
            break;
        }
        videofilters[nb_active_filter].filter->getCoupledConf (&coup);
        videofilters[nb_active_filter].conf = coup;
        nb_active_filter++;
        updateFilterList ();
        setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], nb_active_filter-2);
        break;

    case A_VCD:
        setVCD ();
        updateFilterList ();
        setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], nb_active_filter-2);
        break;

    case A_SVCD:
        setSVCD ();
        updateFilterList ();
        setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], nb_active_filter-2);
        break;

    case A_DVD:
        setDVD ();
        updateFilterList ();
        setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], nb_active_filter-2);
        break;

    case A_HALFD1:
        setHalfD1 ();
        updateFilterList ();
        setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], nb_active_filter-2);
        break;

    default:
    case A_DOUBLECLICK:
        printf ("Double clicked..");
    case A_CONFIGURE:
        if(!action_parameter) break;
        if(!videofilters[action_parameter].filter->
            configure (videofilters[action_parameter - 1].filter)) break;
        CONFcouple *couple;
        videofilters[action_parameter].filter->getCoupledConf (&couple);
        videofilters[action_parameter].conf = couple;
        getFirstVideoFilter ();
        updateFilterList ();
        setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], action_parameter-1);
        break;

    case A_PARTIAL:
        if (!action_parameter) break;
        AVDMGenericVideoStream *replace;
        CONFcouple *conf;
        conf = videofilters[action_parameter].conf;
        if (videofilters[action_parameter].tag == VF_PARTIAL_FILTER)	// cannot recurse
        {
            GUI_Error_HIG (QT_TR_NOOP("The filter is already partial"), NULL);
            break;
	    }
        replace =
		new ADMVideoPartial (videofilters[action_parameter - 1].
				     filter,
				     videofilters[action_parameter].tag,
				     conf);
        if(replace->configure (videofilters[action_parameter - 1].filter))
        {
            delete videofilters[action_parameter].filter;
			if (conf) delete conf;
			videofilters[action_parameter].filter = replace;
			replace->getCoupledConf (&conf);
			videofilters[action_parameter].conf = conf;
			videofilters[action_parameter].tag = VF_PARTIAL_FILTER;
			getFirstVideoFilter ();
			updateFilterList ();
			setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], action_parameter-1);
        }
        else delete replace;
        break;

    case A_UP:
        if (action_parameter < 2) break;
        // swap action parameter & action parameter -1
        FILTER tmp;
        memcpy (&tmp, &videofilters[action_parameter - 1], sizeof (FILTER));
        memcpy (&videofilters[action_parameter - 1],
            &videofilters[action_parameter], sizeof (FILTER));
        memcpy (&videofilters[action_parameter], &tmp, sizeof (FILTER));
        getFirstVideoFilter ();
        // select action_parameter -1
        updateFilterList ();
        setSelectionNumber (nb_active_filter - 1,
			      WID(treeview0),
			      stores[0], action_parameter - 2);
        break;

    case A_DOWN:
        if (((int) action_parameter < (int) (nb_active_filter - 1)) && (action_parameter))
        {
            // swap action parameter & action parameter -1
            FILTER tmp;
            memcpy (&tmp, &videofilters[action_parameter + 1], sizeof (FILTER));
            memcpy (&videofilters[action_parameter + 1],
                        &videofilters[action_parameter], sizeof (FILTER));
            memcpy (&videofilters[action_parameter], &tmp, sizeof (FILTER));
            getFirstVideoFilter ();
            updateFilterList ();
            setSelectionNumber (nb_active_filter - 1,
			      WID(treeview0),
			      stores[0], action_parameter);
        }
        break;

    case A_REMOVE:
		VF_FILTERS tag;
		AVDMGenericVideoStream *old;
		// we store the one we will delete
		if (action_parameter < 1) break;
		if (videofilters[action_parameter].conf)
		{
			delete videofilters[action_parameter].conf;
			videofilters[action_parameter].conf = NULL;
		}
		// recreate derivated filters
		for (uint32_t i = action_parameter + 1; i < nb_active_filter; i++)
	    {
			delete videofilters[i - 1].filter;
			videofilters[i - 1].filter = filterCreateFromTag(videofilters[i].tag,
															 videofilters[i].conf,
															 videofilters[i - 2].filter);
			videofilters[i - 1].conf = videofilters[i].conf;
			videofilters[i - 1].tag = videofilters[i].tag;
	    }
		delete videofilters[nb_active_filter - 1].filter;
		videofilters[nb_active_filter - 1].filter = NULL;
		nb_active_filter--;
        updateFilterList ();
        if(!setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], action_parameter-1))
            setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], action_parameter-2);
		break;

    case A_DONE:

        break;

    case A_PREVIEW:
        if (!action_parameter) break;

        extern uint32_t curframe;
        DIA_filterPreview(QT_TR_NOOP("Preview"), videofilters[action_parameter].filter, curframe);

        break;

    case A_LOAD:
#ifdef USE_LIBXML2
        GUI_FileSelRead (QT_TR_NOOP("Load set of filters"), filterLoadXml);
#else
        GUI_FileSelRead (QT_TR_NOOP("Load set of filters"), filterLoad);
#endif
        updateFilterList ();
        setSelectionNumber(nb_active_filter-1, WID(treeview0), stores[0], 0);
        break;
    case A_CLOSE:
        //gtk_widget_destroy(dialog);
      gtk_signal_emit_by_name(GTK_OBJECT(dialog),"delete-event");
        
        break;
    case A_SAVE:
        if (nb_active_filter < 2)
        {
            GUI_Error_HIG (QT_TR_NOOP("Nothing to save"), NULL);
        }
        else
#ifdef USE_LIBXML2
            GUI_FileSelWrite (QT_TR_NOOP("Save set of filters"), filterSaveXml);
#else
            GUI_FileSelWrite (QT_TR_NOOP("Save set of filters"), filterSave);
#endif
        break;
#if 0
    default:
        printf ("Unknown action :%d, action param %d\n", action, action_parameter);
        ADM_assert (0);
#endif
    } //end of switch
}
Ejemplo n.º 7
0
/*--------------------------------------------------------------------*/
uint8_t  mpegWritter::dopass2(char *name,char *statname,uint32_t final_size,uint32_t bitrate,
				ADM_MPEGTYPE mpegtype,int matrix,uint8_t interlaced,
					uint8_t bff,        // WLA
					uint8_t widescreen)
{
int 			intra,q;
uint32_t 		size;
AVDMGenericVideoStream	*incoming;

FILE			*fd=NULL;
uint64_t		total_size=0;
uint32_t		len,flags,type,outquant;


   	incoming = getLastVideoFilter (frameStart,frameEnd-frameStart);
	if(!_audio)
	{
		fd=fopen(name,"wb");
		if(!fd)
		{
			GUI_Alert("Problem opening file!");
			return 0;

		}
	}

//	if(!init(name,mpegtype,interlaced,widescreen))
	if(!init(name,mpegtype,interlaced,bff,widescreen)) // WLA
	{
		printf("Mpeg2 init failed\n");
		 return 0;
	}
			printf("\n mpeg2enc init done \n");

	assert(  _buffer);
	assert(  _buffer_out);
	encoding->reset();
	encoding->setFrame (0, _total);

/*-------------------- Pass 1 over, go to pass 2 --------------------------------*/
	total_size=0;
	 memset(&mpegvbr,0,sizeof(mpegvbr));
	if(0>  vbrSetDefaults(&mpegvbr))
	{
		printf("set default failed\n");
		return 0;
	}
	mpegvbr.fps=_fps1000/1000.;

	mpegvbr.mode=VBR_MODE_2PASS_2;
	mpegvbr.desired_size=final_size*1024*1024;
	mpegvbr.debug=0;
	mpegvbr.filename=statname; //XvidInternal2pass_statfile;

	float br;
	uint32_t avg;

	br=mpegvbr.desired_size*8;
	br=br/_total;				// bit / frame
	br=br*mpegvbr.fps;

	mpegvbr.desired_bitrate= (int)floor(br);
	avg=(uint32_t)floor(br/1000.);
	printf("average bitrate : %lu\n",avg);
	//mpegvbr.maxAllowedBitrate=(2500*1000)>>3; 
	// enable stuff in xvid
	//mpegvbr.twopass_max_bitrate=2500*1000;
	//mpegvbr.alt_curve_high_dist=10;
	//mpegvbr.alt_curve_low_dist=30;
	//mpegvbr.alt_curve_type=VBR_ALT_CURVE_AGGRESIVE;

	if(0>vbrInit(&mpegvbr))
	{
		GUI_Alert("Error initializing 2 pass!");
		return 0;
	}
	encoding->setPhasis("2nd Pass");
	q=2;

	//mpegvbr.maxAllowedBitrate=(bitrate*1000)>>3;//(bitrate*1000)>>3;
	//mpegvbr.maxAllowedBitrate=(9000*1000)>>3; // enable stuff in xvid


//->
	switch(mpegtype)
	{
		case ADM_SVCD:
						
			Mpeg2encSVCD *dec;
				dec=new Mpeg2encSVCD(_w,_h);
				dec->setMatrix(matrix);
//				dec->init(q,bitrate,_fps1000,interlaced,widescreen);
				dec->init(q,bitrate,_fps1000,interlaced,bff,widescreen); // WLA
				_codec=dec;
				encoding->setCodec("SVCD");
				printf("Svcd  max bitrate : %d\n",bitrate);
				break;
		case ADM_DVD:
			{
				
				Mpeg2encDVD *dec;
				dec=new Mpeg2encDVD(_w,_h);
				dec->setMatrix(matrix);
//			dec->init(q,bitrate,_fps1000,interlaced,widescreen);
				dec->init(q,bitrate,_fps1000,interlaced,bff,widescreen); // WLA
				_codec=dec;
				printf("DVD  max bitrate : %d\n",bitrate);
				encoding->setCodec("DVD");
			}
			break;
		default:
				assert(0);
				break;
	}
	encoding->setPhasis("2nd Pass");
	for(uint32_t i=0;i<_total;i++)
	{
        	if(!incoming->getFrameNumberNoAlloc(i, &size,(uint8_t *) _buffer,&flags))
		{
               		GUI_Alert("Encoding error !");
			if(!_audio)
				fclose(fd);
			end();
			return 0 ;
		}
		encoding->setFrame(i,_total);

		if(i<MPEG_PREFILL)
		{

			_codec->encode(_buffer,_buffer_out , &len,&flags,&outquant);	
			continue;
		}
		encoding->feedFrame(len); // Set
		/* prepare quantization for next gop */
		//if(vbr_next_intra( &mpegvbr))
		{
			q=vbrGetQuant(&mpegvbr);
			_codec->setQuantize(q);
		}
		_codec->encode(_buffer,_buffer_out , &len,&flags,&outquant);
		encoding->setQuant(outquant);
		if(flags & AVI_KEY_FRAME) intra=1;
		else			intra=0;
		switch(flags)
		{
			case AVI_KEY_FRAME: 	type=1;
																		break;
			case AVI_B_FRAME: 	type=3;
																		break;
			default:
						type=2;
						break;
		}
		aprintf("inquant  : %02d outquant %02d Intra %d size :%d flags %x\n",
				q,outquant,intra,len,flags);
		vbrUpdate(&mpegvbr,
				outquant,
				//q,
				intra,
				0,
				len,
				0,
				0,
				type);

		total_size+=len;
	
		if(!_audio)
			{			
				fwrite(_buffer_out,len,1,fd);
				fflush(fd);
			}
		else
			{
				fwrite(_buffer_out,len,1,_videoFifo);
				fflush(_videoFifo);
				len=_audioOneFrame;
				len = _audio->read (len, _audioBuffer);
				fwrite(_audioBuffer,len,1,_audioFifo);		
				fflush(_audioFifo);
			}
		
				
				
		if(!encoding->isAlive())
		{
			 end();
			 fclose(fd);
			 return 0;
		}
	}
			
//--
// flush queue
	for(uint32_t i=0;i<MPEG_PREFILL;i++)
	{
		
		q=vbrGetQuant(&mpegvbr);
		_codec->setQuantize(q);
		_codec->encode(		_buffer,_buffer_out , &len,&flags,&outquant);
		encoding->setQuant(outquant);
		if(flags & AVI_KEY_FRAME) intra=1;
			else		intra=0;
		switch(flags)
		{
			case AVI_KEY_FRAME: 	type=1;
						break;
			case AVI_B_FRAME: 	type=3;
						break;
			default:
						type=2;
						break;
		}		

		printf("inquant  : %02d outquant %02d Intra %d size :%d flags %x\n",q,outquant,
					intra,len,flags);
		vbrUpdate(&mpegvbr,
				outquant,
				//q,
				intra,
				0,
				len,
				0,
				0,
				type);

		total_size+=len;
		if(!_audio)
		{		
			fwrite(_buffer_out,len,1,fd);
			fflush(fd);
		}
		else
		{
			fwrite(_buffer_out,len,1,_videoFifo);
			fflush(_videoFifo);
			len=_audioOneFrame;
			len = _audio->read (len, _audioBuffer);
			fwrite(_audioBuffer,len,1,_audioFifo);
			fflush(_audioFifo);
		}
		
		//	printf("\n pipe opened %ld\n",i);
		encoding->feedFrame(len); // Set
		encoding->setFrame(i,MPEG_PREFILL);
		
	}
//--			
	if(!_audio)	
		fclose(fd);
	else
	{
		fflush(_audioFifo);
		fflush(_videoFifo);
		if(_audioFifo)
		{
			fclose(_audioFifo);
			_audioFifo=NULL;
		}
		if(_videoFifo)
		{
			fclose(_videoFifo);
			_videoFifo=NULL;
		}
		if(_lvepipe)
			{
				printf("Killing lvemux (main loop)\n");
			 	pclose(_lvepipe);
		 		_lvepipe=NULL;
			}				
	}

	 end();
	return 1;
}
Ejemplo n.º 8
0
/*-------------------------------------------------------------------------------------------------------*/
uint8_t  mpegWritter::dopass1(char *name,char *statname,uint32_t final_size,uint32_t bitrate,
				ADM_MPEGTYPE mpegtype,int matrix,uint8_t interlaced,
					uint8_t bff,        // WLA
					uint8_t widescreen)
{
uint32_t 						size;
AVDMGenericVideoStream	 *incoming;

FILE						*fd;
uint64_t						total_size=0;
uint32_t						len,flags,type,outquant;
float 						br;
uint32_t 						avg;

int intra,q;


   					

   	incoming = getLastVideoFilter (frameStart,frameEnd-frameStart);

//	if(!init(name,mpegtype,interlaced,widescreen)) return 0;
	if(!init(name,mpegtype,interlaced,bff,widescreen)) return 0; // WLA
	printf("\n mpeg2enc init done \n");

	assert(  _buffer);
	assert(  _buffer_out);

	q=6; // q=2
	encoding->setPhasis("1st Pass");
	bitrate=0; // we dont care in pass 1 ...

 	memset(&mpegvbr,0,sizeof(mpegvbr));
       	if(0>  vbrSetDefaults(&mpegvbr)) 				return 0;
	mpegvbr.fps=_fps1000/1000.;

 	mpegvbr.mode=VBR_MODE_2PASS_1;
	mpegvbr.desired_size=final_size*1024*1024;
	mpegvbr.debug=0;
	mpegvbr.filename=statname; //XvidInternal2pass_statfile;

					
	br=mpegvbr.desired_size*8;
	br=br/_total;				// bit / frame
	br=br*mpegvbr.fps;
	br/=1000;
	avg=(uint32_t)floor(br);

	printf("Average bitrate : %lu\n",avg);

	if(0>   vbrInit(&mpegvbr))             				return 0;

	switch(mpegtype)
	{
		case ADM_SVCD:
				Mpeg2encSVCD *dec;
				dec=new Mpeg2encSVCD(_w,_h);
				dec->setMatrix(matrix);
#ifdef ADM_1PASS_CBR						
				dec->disablePadding();	
				//dec->init(qz,bitrate,_fps1000,interlaced,widescreen);	
//				dec->init(0,avg*1000,_fps1000,interlaced,widescreen);
				dec->init(0,avg*1000,_fps1000,interlaced,bff,widescreen); // WLA
#else
//				dec->init(q,0,_fps1000,interlaced,widescreen);
				dec->init(q,0,_fps1000,interlaced,bff,widescreen); // WLA
#endif						
				 // 6 Megabits should be enough
				//dec->init(0,avg,_fps1000); // 6 Megabits should be enough
				_codec=dec;
				encoding->setCodec("SVCD");
				break;
		case ADM_DVD:
			{

				Mpeg2encDVD *dec;
				dec=new Mpeg2encDVD(_w,_h);
				dec->setMatrix(matrix);
						
#ifdef ADM_1PASS_CBR
				dec->disablePadding();
//						dec->init(0,avg*1000,_fps1000,interlaced,widescreen);
				dec->init(0,avg*1000,_fps1000,interlaced,bff,widescreen); // WLA
#else						
//				dec->init(q,0,_fps1000,interlaced,widescreen);
				dec->init(q,0,_fps1000,interlaced,bff,widescreen); // WLA
#endif						
				_codec=dec;
				encoding->setCodec("DVD");;
				}
				break;
		default:
				assert(0);
				break;
	}

	encoding->setFrame (0, _total);

	for(uint32_t i=0;i<_total;i++)
	{
		_codec->setQuantize(q);
        	if(!	incoming->getFrameNumberNoAlloc(i, &size,(uint8_t *) _buffer,&flags))
		{
        		GUI_Alert("Encoding error !");
			end();
			return 0 ;
		}
		if(i<MPEG_PREFILL)
				{

					_codec->encode(_buffer,_buffer_out , &len,&flags,&outquant);
					continue;
				}
		_codec->encode(		_buffer,_buffer_out , &len,&flags,&outquant);
		total_size+=len;

		if(flags & AVI_KEY_FRAME) intra=1;
			else					intra=0;
		aprintf("inquant  : %02d outquant :%02d Intra %d, len %lu\n",q,outquant,intra,len);

		switch(flags)
		{
			case AVI_KEY_FRAME: 	type=1;
						break;
			case AVI_B_FRAME: 	type=3;
						break;
			default:
						type=2;
						break;
		}

		vbrUpdate(&mpegvbr,
				outquant,
				intra,
				0,
				len,
				0,
				0,
				type);
		encoding->setFrame(i,_total);
		encoding->setQuant(outquant);
		encoding->feedFrame(len);
		if(!encoding->isAlive())
		{
				 end();
				 return 0;
		}
	}
	// flush queue
	for(uint32_t i=0;i<MPEG_PREFILL;i++)
	{
		_codec->encode(		_buffer,_buffer_out , &len,&flags,&outquant);
		total_size+=len;

		if(flags & AVI_KEY_FRAME) intra=1;
			else					intra=0;
		aprintf("inquant  : %02d outquant :%02d Intra %d\n",q,outquant,intra);

		switch(flags)
		{
			case AVI_KEY_FRAME: 	type=1;
									break;
			case AVI_B_FRAME: 	type=3;
									break;
			default:
								type=2;
								break;
		}
		vbrUpdate(&mpegvbr,
				outquant,
				intra,
				0,
				len,
				0,
				0,
				type);
		encoding->setFrame(i,MPEG_PREFILL);
		encoding->setQuant(outquant);
		encoding->feedFrame(len);
		
	}
	// flush queue
	delete _codec;
	_codec=NULL;
	vbrFinish(&mpegvbr);
	return 1;
}
Ejemplo n.º 9
0
/*-------------------------------------------------------------------------------------------------------------------*/
uint8_t  mpegWritter::save_dualpass(char *name,uint32_t final_size,uint32_t bitrate,ADM_MPEGTYPE mpegtype,
					int matrix,uint8_t interlaced,
					uint8_t bff,        // WLA
					uint8_t widescreen)
{
AVDMGenericVideoStream	 *incoming;
char *statname;

	incoming = getLastVideoFilter (frameStart,frameEnd-frameStart);
	_w=incoming->getInfo()->width;
	_h=incoming->getInfo()->height;
	_page=_w*_h;
	_page+=_page>>1;
	_fps1000=incoming->getInfo()->fps1000;
		_total=incoming->getInfo()->nb_frames;
	if(!_total) return 0;
	_buffer	=new uint8_t[_w*_h*2];
	_buffer_out=new uint8_t[_w*_h*2];


	statname=new char[strlen(name)+4+1];
	strcpy(statname,name);
	strcat(statname,".st");
	printf("Matrix : %d\n\n",matrix);
	encoding=new DIA_encoding(_fps1000);
	encoding->setPhasis("Encoding");


	// check if stat file exists ?
	FILE *fd;
	uint8_t reuse=0;
	fd=fopen(statname,"rt");
	if(fd)
	{
		fclose(fd);
		if(GUI_Question("Reuse log file ?")) reuse=1;
	}
#if 1
if(!reuse)
//	if(!dopass1(name,statname,final_size,bitrate,mpegtype,matrix,interlaced,widescreen))
	if(!dopass1(name,statname,final_size,bitrate,mpegtype,matrix,interlaced,bff,widescreen)) 
	// WLA
	{
		delete encoding;
		GUI_Alert("Error in pass 1");
		delete [] statname;
		return 0;
	}
#endif
//	if(!dopass2(name,statname,final_size,bitrate,mpegtype,matrix,interlaced,widescreen))
	if(!dopass2(name,statname,final_size,bitrate,mpegtype,matrix,interlaced,bff,widescreen)) 
	// WLA
	{
		delete encoding;
		GUI_Alert("Error in pass 2");
		delete [] statname;
		return 0;
	}
	delete encoding;
	delete [] statname;
	return 1;
}
Ejemplo n.º 10
0
unsigned int calculatorDialog::getPictureSize(void)
{
    AVDMGenericVideoStream *last = getLastVideoFilter();

    return last->getInfo()->width * last->getInfo()->height;
}
Ejemplo n.º 11
0
//****************************************************************
uint8_t
mpegWritter::dopass2 (const char *name, char *statname, uint32_t final_size, uint32_t bitrate, ADM_MPEGTYPE mpegtype, int matrix, uint8_t interlaced, uint8_t bff,	// WLA
		      uint8_t widescreen)
{
  int intra, q;
  uint32_t size;
  AVDMGenericVideoStream *incoming;

  FILE *fd = NULL;
  uint64_t total_size = 0;
  uint32_t len, flags, type, outquant, audiolen;
  uint32_t sample_target = 0;
  double sample_time;
  ADMBitstream bitstream;

  memset (quantstat, 0, 32);

  incoming = getLastVideoFilter (frameStart, frameEnd - frameStart);
  if (!_audio)
    {
      if (!(fd = qfopen (name, "wb")))
	return 0;
    }

//      if(!init(name,mpegtype,interlaced,widescreen))
  if (!init (name, mpegtype, interlaced, bff, widescreen))	// WLA
    {
      printf ("Mpeg2 init failed\n");
      return 0;
    }
  printf ("\n mpeg2enc init done \n");

  ADM_assert (aImage);
  ADM_assert (_buffer_out);
  encoding->reset ();
  encoding->setFrame (0, _total);

/*-------------------- Pass 1 over, go to pass 2 --------------------------------*/

  ADM_assert (_ratecontrol->startPass2 (final_size, _total));

  encoding->setPhasis ("2nd Pass");
  q = 2;

  //mpegvbr.maxAllowedBitrate=(bitrate*1000)>>3;//(bitrate*1000)>>3;
  //mpegvbr.maxAllowedBitrate=(9000*1000)>>3; // enable stuff in xvid


//->
  switch (mpegtype)
    {
    case ADM_SVCD:

      Mpeg2encSVCD * dec;
      dec = new Mpeg2encSVCD (_w, _h);
      dec->setMatrix (matrix);
//                              dec->init(q,bitrate,_fps1000,interlaced,widescreen);
      dec->init (q, bitrate, _fps1000, interlaced, bff, widescreen, 0);	// WLA
      _codec = dec;
      encoding->setCodec ("SVCD");
      printf ("Svcd  max bitrate : %d\n", bitrate);
      break;
    case ADM_DVD:
      {

	Mpeg2encDVD *dec;
	dec = new Mpeg2encDVD (_w, _h);
	dec->setMatrix (matrix);
//                      dec->init(q,bitrate,_fps1000,interlaced,widescreen);
	dec->init (q, bitrate, _fps1000, interlaced, bff, widescreen, 0);	// WLA
	_codec = dec;
	printf ("DVD  max bitrate : %d\n", bitrate);
	encoding->setCodec ("DVD");
      }
      break;
    default:
      ADM_assert (0);
      break;
    }
  encoding->setPhasis ("2nd Pass");
  if (_muxer)
    {
      encoding->
	setAudioCodec (getStrFromAudioCodec (_audio->getInfo ()->encoding));
      sample_time = _total;
      sample_time *= 1000;
      sample_time /= _fps1000;	// target_time in second
      sample_time *= _audio->getInfo ()->frequency;
      sample_target = (uint32_t) floor (sample_time);
    }
  bitstream.data = _buffer_out;
  for (uint32_t i = 0; i < _total; i++)
    {
      if (!incoming->getFrameNumberNoAlloc (i, &size, aImage, &flags))
	{
          GUI_Error_HIG (_("Encoding error"), NULL);
	  if (!_audio)
	    qfclose (fd);
	  end ();
	  return 0;
	}
      encoding->setFrame (i, _total);

      if (i < MPEG_PREFILL)
	{

	  _codec->encode (aImage, &bitstream);	//_buffer_out , &len,&flags,&outquant);   
	  quantstat[bitstream.out_quantizer]++;
	  continue;
	}
     	// Set
      //
      ADM_rframe ftype, ztype;
      uint32_t qz;
      ADM_assert (_ratecontrol->getQz (&qz, &ztype));
      q = qz;
      //_codec->setQuantize(q);
      bitstream.in_quantizer = q;
      _codec->encode (aImage, &bitstream);	//_buffer_out , &len,&flags,&outquant);
      quantstat[bitstream.out_quantizer]++;
      encoding->setQuant (bitstream.out_quantizer);

      switch (bitstream.flags)
	{
	case AVI_KEY_FRAME:
	  ftype = RF_I;
	  break;
	case AVI_B_FRAME:
	  ftype = RF_B;
	  break;
	default:
	  ftype = RF_P;
	  break;
	}
      if (ftype != ztype)
	{
	  printf ("**Frame type does not match %d %d\n", ztype, ftype);
	}
      //aprintf("inquant  : %02d outquant %02d Intra %d size :%d flags %x\n",
      //              q,outquant,intra,len,flags);
      ADM_assert (_ratecontrol->
		  logPass2 (bitstream.out_quantizer, ftype, bitstream.len));
      total_size += bitstream.len;
      encoding->feedFrame (bitstream.len);
      if (!_muxer)
	{
	  qfwrite (_buffer_out, bitstream.len, 1, fd);
	  fflush (fd);
	}
      else
	{

	  // write video
	  _muxer->writeVideoPacket (&bitstream);

	  PACK_AUDIO;
	}



      if (!encoding->isAlive ())
	{
	  print_quant_stat (name);
	  end ();
	  qfclose (fd);
	  return 0;
	}
    }

//--
// flush queue
  for (uint32_t i = 0; i < MPEG_PREFILL; i++)
    {

      ADM_rframe ftype;
      uint32_t qz;
      ADM_assert (_ratecontrol->getQz (&qz, &ftype));
      q = qz;
      //_codec->setQuantize(q);
      bitstream.in_quantizer = q;
      _codec->encode (aImage, &bitstream);	//_buffer_out , &len,&flags,&outquant);
      quantstat[bitstream.out_quantizer]++;
      encoding->setQuant (bitstream.out_quantizer);
      switch (bitstream.flags)
	{
	case AVI_KEY_FRAME:
	  ftype = RF_I;
	  break;
	case AVI_B_FRAME:
	  ftype = RF_B;
	  break;
	default:
	  ftype = RF_P;
	  break;
	}
      //aprintf("inquant  : %02d outquant %02d Intra %d size :%d flags %x\n",
      //                      q,outquant,intra,len,flags);
      ADM_assert (_ratecontrol->
		  logPass2 (bitstream.out_quantizer, ftype, bitstream.len));

      total_size += bitstream.len;
      if (!_muxer)
	{
	  qfwrite (_buffer_out, bitstream.len, 1, fd);
	  fflush (fd);
	}
      else
	{
	  // write video
            _muxer->writeVideoPacket (&bitstream);
	  PACK_AUDIO;

	}

      //      printf("\n pipe opened %ld\n",i);
      encoding->feedFrame (bitstream.len);	// Set
      encoding->setQuant (bitstream.out_quantizer);
      encoding->setFrame (i, MPEG_PREFILL);

    }
//--                    
  if (!_muxer)
    qfclose (fd);
  else
    {
      _muxer->close ();
      delete _muxer;
      _muxer = NULL;
    }

  print_quant_stat (name);
  end ();
  return 1;
}
Ejemplo n.º 12
0
/*-------------------------------------------------------------------------------------------------------*/
uint8_t
mpegWritter::dopass1 (const char *name, char *statname, uint32_t final_size, uint32_t bitrate, ADM_MPEGTYPE mpegtype, int matrix, uint8_t interlaced, uint8_t bff,	// WLA
		      uint8_t widescreen)
{
  uint32_t size;
  AVDMGenericVideoStream *incoming;

  FILE *fd;
  uint64_t total_size = 0;
//uint32_t                                              len,flags,type,outquant;
  float br;
  uint32_t avg, flags;

  int intra, q;
  ADMBitstream bitstream;



  incoming = getLastVideoFilter (frameStart, frameEnd - frameStart);

//      if(!init(name,mpegtype,interlaced,widescreen)) return 0;
  if (!init (name, mpegtype, interlaced, bff, widescreen))
    return 0;			// WLA
  printf ("\n mpeg2enc init done \n");

  ADM_assert (aImage);
  ADM_assert (_buffer_out);

  q = 2;			// q=2
  encoding->setPhasis ("1st Pass");
  bitrate = 0;			// we dont care in pass 1 ...



  ADM_assert (_ratecontrol->startPass1 ());

  switch (mpegtype)
    {
    case ADM_SVCD:
      Mpeg2encSVCD * dec;
      dec = new Mpeg2encSVCD (_w, _h);
      dec->setMatrix (matrix);
#ifdef ADM_1PASS_CBR
      dec->disablePadding ();
      //dec->init(qz,bitrate,_fps1000,interlaced,widescreen); 
//                              dec->init(0,avg*1000,_fps1000,interlaced,widescreen);
      dec->init (0, avg * 1000, _fps1000, interlaced, bff, widescreen, 1);	// WLA
#else
//                              dec->init(q,0,_fps1000,interlaced,widescreen);
      dec->init (q, 0, _fps1000, interlaced, bff, widescreen, 1);	// WLA
#endif
      // 6 Megabits should be enough
      //dec->init(0,avg,_fps1000); // 6 Megabits should be enough
      _codec = dec;
      encoding->setCodec ("SVCD");
      break;
    case ADM_DVD:
      {

	Mpeg2encDVD *dec;
	dec = new Mpeg2encDVD (_w, _h);
	dec->setMatrix (matrix);

#ifdef ADM_1PASS_CBR
	dec->disablePadding ();
//                                              dec->init(0,avg*1000,_fps1000,interlaced,widescreen);
	dec->init (0, avg * 1000, _fps1000, interlaced, bff, widescreen, 1);	// WLA
#else
//                              dec->init(q,0,_fps1000,interlaced,widescreen);
	dec->init (q, 0, _fps1000, interlaced, bff, widescreen, 1);	// WLA
#endif
	_codec = dec;
	encoding->setCodec ("DVD");;
      }
      break;
    default:
      ADM_assert (0);
      break;
    }

  encoding->setFrame (0, _total);
  bitstream.data = _buffer_out;
  for (uint32_t i = 0; i < _total; i++)
    {
      
      if (!incoming->getFrameNumberNoAlloc (i, &size, aImage, &flags))
	{
          GUI_Error_HIG (_("Encoding error"), NULL);
	  end ();
	  return 0;
	}
      if (i < MPEG_PREFILL)
	{
	  bitstream.cleanup (i);
	  bitstream.in_quantizer=q;
	  _codec->encode (aImage, &bitstream);
	  //_buffer_out , &len,&flags,&outquant);
	  continue;
	}
      bitstream.cleanup (i);
      _codec->encode (aImage, &bitstream);	//_buffer_out , &len,&flags,&outquant);
      total_size += bitstream.len;


//              aprintf("inquant  : %02d outquant :%02d Intra %d, len %lu\n",q,outquant,intra,len);

      ADM_rframe ftype;
      switch (bitstream.flags)
	{
	case AVI_KEY_FRAME:
	  ftype = RF_I;
	  break;
	case AVI_B_FRAME:
	  ftype = RF_B;
	  break;
	default:
	  ftype = RF_P;
	  break;
	}

      ADM_assert (_ratecontrol->
		  logPass1 (bitstream.out_quantizer, ftype, bitstream.len));

      encoding->setFrame (i, _total);
      encoding->setQuant (bitstream.out_quantizer);
      encoding->feedFrame (bitstream.len);
      if (!encoding->isAlive ())
	{
	  end ();
	  return 0;
	}
    }
  // flush queue
  for (uint32_t i = 0; i < MPEG_PREFILL; i++)
    {
        bitstream.cleanup (i);
      _codec->encode (aImage, &bitstream);	//_buffer_out , &len,&flags,&outquant);
      total_size += bitstream.len;


      aprintf ("inquant  : %02d outquant :%02d Intra %d\n", q,
	       bitstream.out_quantizer, intra);

      ADM_rframe ftype;
      switch (bitstream.flags)
	{
	case AVI_KEY_FRAME:
	  ftype = RF_I;
	  break;
	case AVI_B_FRAME:
	  ftype = RF_B;
	  break;
	default:
	  ftype = RF_P;
	  break;
	}
      ADM_assert (_ratecontrol->
		  logPass1 (bitstream.out_quantizer, ftype, bitstream.len));

      encoding->setFrame (i, MPEG_PREFILL);
      encoding->setQuant (bitstream.out_quantizer);
      encoding->feedFrame (bitstream.len);

    }
  // flush queue
  delete _codec;
  _codec = NULL;

  return 1;
}
Ejemplo n.º 13
0
/*-------------------------------------------------------------------------------------------------------------------*/
uint8_t
mpegWritter::save_dualpass (const char *name, uint32_t final_size, uint32_t bitrate, ADM_MPEGTYPE mpegtype, int matrix, uint8_t interlaced, uint8_t bff,	// WLA
			    uint8_t widescreen)
{
  AVDMGenericVideoStream *incoming;
  char *statname;
  uint32_t reuse = 0;

  incoming = getLastVideoFilter (frameStart, frameEnd - frameStart);
  _w = incoming->getInfo ()->width;
  _h = incoming->getInfo ()->height;
  _page = _w * _h;
  _page += _page >> 1;
  _fps1000 = incoming->getInfo ()->fps1000;
  _total = incoming->getInfo ()->nb_frames;
  if (!_total)
    return 0;
  //_buffer       =new uint8_t[_w*_h*2];
  aImage = new ADMImage (_w, _h);
  _buffer_out = new uint8_t[_w * _h * 2];


  statname = new char[strlen (name) + 4 + 1];
  strcpy (statname, name);
  strcat (statname, ".st");
  printf ("Matrix : %d\n\n", matrix);
  encoding = new DIA_encoding (_fps1000);
  encoding->setPhasis ("Encoding");


  // check if stat file exists ?
#if 1				//ndef CYG_MANGLING
  {
    FILE *fd;
    fd = fopen (statname, "rt");
    if (fd)
      {
	fclose (fd);
	prefs->get (FEATURE_REUSE_2PASS_LOG, (uint32_t *) & reuse);
        if (!reuse && GUI_Question (_("Reuse log file ?")))
	  reuse = 1;
      }
  }
#endif
  //_ratecontrol=new ADM_oldXvidRc(_fps1000,statname);
  _ratecontrol = new ADM_newXvidRc (_fps1000, statname);

#if 1
  if (!reuse)
//      if(!dopass1(name,statname,final_size,bitrate,mpegtype,matrix,interlaced,widescreen))
    if (!dopass1
	(name, statname, final_size, bitrate, mpegtype, matrix, interlaced,
	 bff, widescreen))
      // WLA
      {
	delete encoding;
        GUI_Error_HIG (_("Error in pass 1"), NULL);
	delete[]statname;
	return 0;
      }
#endif
//      if(!dopass2(name,statname,final_size,bitrate,mpegtype,matrix,interlaced,widescreen))
  if (!dopass2
      (name, statname, final_size, bitrate, mpegtype, matrix, interlaced, bff,
       widescreen))
    // WLA
    {
      delete encoding;
      GUI_Error_HIG (_("Error in pass 2"), NULL);
      delete[]statname;
      return 0;
    }
  delete encoding;
  delete[]statname;
  return 1;
}
Ejemplo n.º 14
0
/*
	Save as with the external mpeg2enc

*/
uint8_t
mpegWritter::save_regular (const char *name, ADM_MPEGTYPE mpegtype, int qz, int bitrate, int matrix, uint8_t interlaced, uint8_t bff,	// WLA
			   uint8_t widescreen)
{
  uint32_t size;
  AVDMGenericVideoStream *incoming;

  FILE *fd = NULL;
  uint64_t total_size = 0;
  uint32_t len, flags;
  uint32_t outquant;
  uint32_t audiolen = 0;
  DIA_encoding *encoding;
  uint32_t sample_target = 0;
  double sample_time;
  ADMBitstream bitstream;
  incoming = getLastVideoFilter (frameStart, frameEnd - frameStart);
  _total = incoming->getInfo ()->nb_frames;
  _fps1000 = incoming->getInfo ()->fps1000;
  if (!_total)
    {
      GUI_Error_HIG (_("No frames to encode"),
                     _("Please check markers. Is \"A>\" == \">B\"?"));
      return 0;
    }

  printf ("Br:%d, qz:%d\n", bitrate, qz);
  if (!_audio)
    {
      if (!(fd = qfopen (name, "wb")))
	return 0;
    }
  else
    {
      ADM_assert (_muxer);
      sample_time = _total;
      sample_time *= 1000;
      sample_time /= _fps1000;	// target_time in second
      sample_time *= _audio->getInfo ()->frequency;
      sample_target = (uint32_t) floor (sample_time);

    }


  _w = incoming->getInfo ()->width;
  _h = incoming->getInfo ()->height;


  _page = _w * _h;
  _page += _page >> 1;

//                      if(!init(name,ADM_VCD,interlaced,widescreen)) return 0;
  if (!init (name, ADM_VCD, interlaced, bff, widescreen))
    return 0;			//WLA
  printf ("\n mpeg2enc init done \n");


  //_buffer       =new uint8_t[_w*_h*2];
  aImage = new ADMImage (_w, _h);
  _buffer_out = new uint8_t[_w * _h * 2];

  ADM_assert (aImage);
  ADM_assert (_buffer_out);

  encoding = new DIA_encoding (_fps1000);

  encoding->setPhasis ("Encoding.");
  encoding->setFrame (0, _total);
//      printf("Br:%d, qz:%d\n",bitrate,qz);

  switch (mpegtype)
    {
    case ADM_VCD:
      {
	encoding->setCodec ("VCD.");
	Mpeg2encVCD *dec;
	dec = new Mpeg2encVCD (_w, _h);
//                                      dec->init(1,0,_fps1000,interlaced,widescreen);
	dec->init (1, 0, _fps1000, interlaced, bff, widescreen, 0);	// WLA
	_codec = dec;
      }
      break;
    case ADM_SVCD:

      Mpeg2encSVCD * dec;
      dec = new Mpeg2encSVCD (_w, _h);
      dec->setMatrix (matrix);
//                                      dec->init(qz,bitrate,_fps1000,interlaced,widescreen);
      dec->init (qz, bitrate, _fps1000, interlaced, bff, widescreen, 0);
      // WLA
      _codec = dec;
      encoding->setCodec ("SVCD.");

      break;

    case ADM_DVD:
      {
	Mpeg2encDVD *dec;
	dec = new Mpeg2encDVD (_w, _h);
	dec->setMatrix (matrix);
//                                      dec->init(qz,bitrate,_fps1000,interlaced,widescreen);
	dec->init (qz, bitrate, _fps1000, interlaced, bff, widescreen, 0);
	// WLA
	_codec = dec;
	encoding->setCodec ("DVD.");

      }
      break;
    default:
      ADM_assert (0);
    }

  printf ("\n--encoding started--\n");
  if (_muxer)
    {
      if (audioProcessMode ())
	encoding->
	  setAudioCodec (getStrFromAudioCodec (_audio->getInfo ()->encoding));
      else
	encoding->setAudioCodec ("Copy");
      switch (_outputAs)
	{

	case MUXER_TS:
	  encoding->setContainer ("Mpeg TS");
	  break;
	case MUXER_VCD:
	  encoding->setContainer ("Mpeg VCD");
	  break;
	case MUXER_SVCD:
	  encoding->setContainer ("Mpeg SVCD");
	  break;
	case MUXER_DVD:
	  encoding->setContainer ("Mpeg DVD");
	  break;
	default:
	  ADM_assert (0);
	}

    }
  else
    encoding->setContainer ("Mpeg ES");
  bitstream.data = _buffer_out;
  for (uint32_t i = 0; i < _total; i++)
    {
      if (!incoming->getFrameNumberNoAlloc (i, &size, aImage, &flags))
	{
	  delete encoding;
          GUI_Error_HIG (_("Encoding error"), NULL);
	  if (fd)
	    qfclose (fd);
	  end ();
	  return 0;
	}
      bitstream.cleanup (i);
      bitstream.in_quantizer=0;
      _codec->encode (aImage, &bitstream);
      //_buffer_out , &len,&flags,&outquant);
      total_size += bitstream.len;
      encoding->feedFrame (bitstream.len);
      encoding->setQuant (bitstream.out_quantizer);
      encoding->setFrame (i, _total);
      // Null frame are only possible
      // when in prefill state for mpeg-X
      if (!len)
	continue;
      if (_muxer)
	{
#warning FIXME
#warning FIXME
#warning FIXME
#warning FIXME
	  _muxer->writeVideoPacket (&bitstream);
	  PACK_AUDIO;

	}
      else
	{
            qfwrite (_buffer_out, bitstream.len, 1, fd);
	  fflush (fd);
	}

      aprintf (" outquant %02d  size :%d flags %x\n", outquant, len, flags);

      if (!encoding->isAlive ())
	{
	  delete encoding;
	  end ();
	  if (fd)
	    qfclose (fd);
	  return 0;
	}
    }
  encoding->setPhasis ("Finishing");
  bitstream.data = _buffer_out;
  for (uint32_t i = 0; i < MPEG_PREFILL; i++)
    {
      bitstream.cleanup (i);
      _codec->encode (aImage, &bitstream);	//_buffer_out , &len,&flags);
      total_size += bitstream.len;
      encoding->feedFrame (bitstream.len);
      if (!_muxer)
          qfwrite (_buffer_out, bitstream.len, 1, fd);
      else
	{
            _muxer->writeVideoPacket (&bitstream);
	  PACK_AUDIO;
	}

      //      printf("\n pipe opened %ld\n",i);
      encoding->setFrame (i, _total);

    }
  delete encoding;

  if (!_muxer)
    qfclose (fd);
  else
    {
      _muxer->close ();
      delete _muxer;
      _muxer = NULL;
      deleteAudioFilter (_audio);
      _audio = NULL;
    }
  end ();
  return 1;

}
Ejemplo n.º 15
0
//static uint8_t Vbuffer[7.0*5.6*3];
//AVDMGenericVideoStream *getFirstVideoFilter( void)
//
//_____________________________________________________________
void GUI_PlayAvi(void)
{
    uint32_t  time_e, time_a = 0;
    uint32_t err = 0, acc = 0;
    uint32_t max;

    uint32_t framelen,flags;
    AVDMGenericVideoStream *filter;
    ADMImage *buffer=NULL;

    vids = 0, auds = 0, dauds = 0;
    // check we got everything...
    if (!avifileinfo)
	return;
  if((curframe+1)>= avifileinfo->nb_frames-1)
  {
      printf("No frame left\n");
      return;
   }
    if (avifileinfo->fps1000 == 0)
        return;
    if (playing)
      {
        stop_req = 1;
        return;
      }
  uint32_t played_frame=0;
  uint32_t remaining=avifileinfo->nb_frames-curframe;


    if(guiOutputDisplay)
    {
                filter=getLastVideoFilter(curframe,remaining);
                if(mode_preview)
                {
                      editorKillPreview ();
                      UI_setPreviewToggleStatus( 0 );
                      mode_preview=0;
                }
    }
    else
    {
            filter=getFirstVideoFilter(curframe,remaining );
    }
    max=filter->getInfo()->nb_frames;

    // compute how much a frame lasts in ms
    one_frame = (uint32_t) floor(1000.*1000.*10. / filter->getInfo()->fps1000);
    err = one_frame % 10;
    one_frame /= 10; // Duration of a frame in ms, err =leftover in 1/10 ms
    buffer=new ADMImage(filter->getInfo()->width,filter->getInfo()->height);
    // go to RealTime...    
    printf(" One frame : %lu, err=%lu ms\n", one_frame, err);
    // read frame in chunk
    if(!filter->getFrameNumberNoAlloc(1,&framelen,buffer,&flags))
    {
        printf("\n cannot read frame!\n");
        goto abort_play;
    }
      curframe++;
      played_frame++;
    // prepare 1st frame

    stop_req = 0;
    playing = 1;

#ifdef HAVE_AUDIO
    ComputePreload();
#endif
     renderResize(filter->getInfo()->width,filter->getInfo()->height,currentZoom);
     renderStartPlaying();
// reset timer reference
    resetTime();
    do
    {
        vids++;
        renderUpdateImage(buffer->data);
        if(mode_preview&&!guiOutputDisplay)
        {	
            editorUpdatePreview(played_frame);
        }
        update_status_bar(buffer);
        if (time_a == 0)
            time_a = getTime(0);
        // mark !
        //printf("\n Rendering %lu frame\n",curframe);
        // read frame in chunk

        if((played_frame)>=(max-1))
        {
            printf("\n End met (%lu  / %lu )\n",played_frame,max);
            goto abort_play;
         }
        if(!filter->getFrameNumberNoAlloc(played_frame+1,&framelen,buffer,&flags))
        {
            printf("\n cannot read frame!\n");
            goto abort_play;
        }
	curframe++;
	played_frame++;

#ifdef HAVE_AUDIO
	  FillAudio();
#endif

	  time_e = getTime(1);
	  acc += err;
	  if (acc > 10)
	    {
		acc -= 10;
		time_a++;
	    }
	  time_a += one_frame;
	  // delta a is next frame time
	  // time is is current time
	  delta = time_a - time_e;
	  if (delta <= 0)
	    {
		//if(delta<-19)  // allow 19 ms late without warning...
		// tick seems to be ~ 18 ms
		//printf("\n Late ....,due : %lu ms / found : %lu \n",
		//                                              time_a,time_e); 
		// a call to whatever sleep function will last at leat 10 ms
		// give some time to GTK                
	
	  } else
	    {
		// a call to whatever sleep function will last at leat 10 ms
		// give some time to GTK                		
		if (delta > 10)
		    GUI_Sleep(delta - 10);
	    }
     	//
            UI_purge();
            if(mode_preview)
            {
              UI_purge();
              UI_purge(); 
            }
      }
    while (!stop_req);

abort_play:
		// ___________________________________
    // Flush buffer   
    // go back to normal display mode
    //____________________________________
    playing = 0;
	  delete  buffer;

	   renderStopPlaying();
	   renderResize(avifileinfo->width ,  avifileinfo->height,currentZoom);
	   getFirstVideoFilter( );
	   //video_body->getUncompressedFrame(curframe, rdr_decomp_buffer,&flags);
	   GUI_getFrame(curframe, rdr_decomp_buffer, &flags);
	   renderUpdateImage(rdr_decomp_buffer->data);
	   renderRefresh();
     	   update_status_bar(rdr_decomp_buffer);
	   if(mode_preview)
	   {
		editorUpdatePreview(curframe);
	   }
#ifdef HAVE_AUDIO
    if (currentaudiostream)
      {
	  if (wavbuf)
	      ADM_dealloc(wavbuf);
          deleteAudioFilter(NULL);
	  currentaudiostream->endDecompress();
	  AVDM_AudioClose();

      }
#endif
    // done.
};
Ejemplo n.º 16
0
//static uint8_t Vbuffer[7.0*5.6*3];
//AVDMGenericVideoStream *getFirstVideoFilter( void)
//
//_____________________________________________________________
void GUI_PlayAvi(bool forceStop)
{
    uint32_t  time_e, time_a = 0;
    uint32_t err = 0, acc = 0;
    uint32_t max;

    uint32_t framelen,flags;
    AVDMGenericVideoStream *filter;

    vids = 0, auds = 0, dauds = 0;
    // check we got everything...
    if (!avifileinfo)
	return;
  if((curframe+1)>= avifileinfo->nb_frames-1)
  {
      printf("No frame left\n");
      return;
   }
    if (avifileinfo->fps1000 == 0)
        return;
    if (playing || forceStop)
      {
        stop_req = 1;
        return;
      }

	uint32_t priorityLevel;

	originalPriority = getpriority(PRIO_PROCESS, 0);
	prefs->get(PRIORITY_PLAYBACK,&priorityLevel);
	setpriority(PRIO_PROCESS, 0, ADM_getNiceValue(priorityLevel));

  uint32_t played_frame=0;
  uint32_t remaining=avifileinfo->nb_frames-curframe;

    
    if(getPreviewMode()==ADM_PREVIEW_OUTPUT)
    {
            filter=getLastVideoFilter(curframe,remaining);
    }
    else
    {
            filter=getFirstVideoFilter(curframe,remaining );
    }
    
    max=filter->getInfo()->nb_frames;

    // compute how much a frame lasts in ms
    one_frame = (uint32_t) floor(1000.*1000.*10. / filter->getInfo()->fps1000);
    err = one_frame % 10;
    one_frame /= 10; // Duration of a frame in ms, err =leftover in 1/10 ms
    
    // go to RealTime...    
    printf("One frame : %lu, err=%lu ms\n", one_frame, err);
    
    // prepare 1st frame

    stop_req = 0;
    playing = 1;

#ifdef HAVE_AUDIO
    ComputePreload();
#endif
    
     
     //renderStartPlaying();
// reset timer reference
    resetTime();
    admPreview::deferDisplay(1,curframe);
    admPreview::update(played_frame);
    do
    {
        vids++;
        admPreview::displayNow(played_frame);;
        update_status_bar();
        if (time_a == 0)
            time_a = getTime(0);
        // mark !
        //printf("\n Rendering %lu frame\n",curframe);
        // read frame in chunk

        if((played_frame)>=(max-1))
        {
            printf("\nEnd met (%lu  / %lu )\n",played_frame,max);
            goto abort_play;
         }
        
        admPreview::update(played_frame+1);;
	curframe++;
	played_frame++;

#ifdef HAVE_AUDIO
	  FillAudio();
#endif

	  time_e = getTime(1);
	  acc += err;
	  if (acc > 10)
	    {
		acc -= 10;
		time_a++;
	    }
	  time_a += one_frame;
	  // delta a is next frame time
	  // time is is current time
	  delta = time_a - time_e;
	  if (delta <= 0)
	    {
		//if(delta<-19)  // allow 19 ms late without warning...
		// tick seems to be ~ 18 ms
		//printf("\n Late ....,due : %lu ms / found : %lu \n",
		//                                              time_a,time_e); 
		// a call to whatever sleep function will last at leat 10 ms
		// give some time to GTK                
	
	  } else
	    {
		// a call to whatever sleep function will last at leat 10 ms
		// give some time to GTK                		
		if (delta > 10)
		    GUI_Sleep(delta - 10);
	    }
     	//
            UI_purge();
            if(getPreviewMode()==ADM_PREVIEW_SEPARATE )
            {
              UI_purge();
              UI_purge(); 
            }
      }
    while (!stop_req);

abort_play:
		// ___________________________________
    // Flush buffer   
    // go back to normal display mode
    //____________________________________
    playing = 0;
          
	   getFirstVideoFilter( );

           admPreview::deferDisplay(0,0);
           UI_purge();
           // Updated by expose ? 
           admPreview::update(curframe);
           UI_purge();
     	   update_status_bar();
#ifdef HAVE_AUDIO
    if (currentaudiostream)
      {
	  if (wavbuf)
	      ADM_dealloc(wavbuf);
          deleteAudioFilter(NULL);
	  currentaudiostream->endDecompress();
	  AVDM_AudioClose();

      }
#endif
    // done.

	setpriority(PRIO_PROCESS, 0, originalPriority);
};
Ejemplo n.º 17
0
uint8_t DIA_threshold (AVDMGenericVideoStream *in,
                       ADMVideoThreshold * thresholdp,
                       THRESHOLD_PARAM * param)
{
    // Allocate space for preview video
    uint32_t width = in->getInfo()->width;
    uint32_t height = in->getInfo()->height;

    dialog = create_threshold_dialog();

	gtk_dialog_set_alternative_button_order(GTK_DIALOG(dialog),
										GTK_RESPONSE_OK,
										GTK_RESPONSE_CANCEL,
										-1);

    gtk_register_dialog(dialog);
    gtk_window_set_title (GTK_WINDOW (dialog),
                          QT_TR_NOOP("Threshold Configuration"));
    gtk_widget_show(dialog);

    myDialog = new flyThreshold (width, height, in,
                                 WID(previewVideo), WID(previewSlider),
                                 thresholdp, param);

    g_signal_connect (GTK_OBJECT (WID(previewVideo)), "configure-event",
                      GTK_SIGNAL_FUNC (preview_video_configured),
                      gpointer (myDialog));

    myDialog->upload();
    myDialog->sliderChanged();

    // update things when settings are changed
#define CNX(_widg,_signame) \
    g_signal_connect(GTK_OBJECT(WID(_widg)), _signame,                \
                     GTK_SIGNAL_FUNC(gui_update), (void *) (1));

//    CNX (minValueSlider, "drag_data_received");
    CNX (minValueSpinner, "value_changed");

//    CNX (maxValueSlider, "drag_data_received");
    CNX (maxValueSpinner, "value_changed");
      
    CNX (outputValuesMenu, "changed");

    g_signal_connect(GTK_OBJECT(WID(previewSlider)), "value_changed",
                     GTK_SIGNAL_FUNC(frame_changed), 0);
    g_signal_connect(GTK_OBJECT(WID(previewVideo)), "expose_event",
                     GTK_SIGNAL_FUNC(gui_draw), 0);

    g_signal_connect(GTK_OBJECT(WID(previewVideo)), "button_press_event",
                     GTK_SIGNAL_FUNC(previewButtonEvent),
                     gpointer(myDialog));
#if 0
    g_signal_connect(GTK_OBJECT(WID(previewVideo)), "motion_notify_event",
                     GTK_SIGNAL_FUNC(previewMotionEvent),
                     gpointer(myDialog));
#endif

    GtkWidget * previewOutputMenu = WID(previewOutputMenu);
    uint32_t filter_count;
    FILTER * filters = getCurrentVideoFilterList (&filter_count);
    int32_t active = -1;

    // The " + (active < 0)" below is a bit of a hack.  We know that in
    // on_action() in gui_filtermanager.cpp, case A_ADD, the new filter-to-be
    // is added to the filter list without incrementing nb_active_filter yet.
    // So if we get to the end of the list and haven't yet found the filter
    // that we're configuring, we know it's a new one and therefore that it is
    // one past the apparent end of the list.  It's not a clean solution, but
    // it seems like the cleanEST solution.

    for (uint32_t i = 0; i < filter_count + (active < 0); i++)
    {
        const char * name
            = (i == 0) ? "(input)" : filterGetNameFromTag (filters [i].tag);
        bool free_name = false;
                                   
        FILTER * filter = filters + i;
        AVDMGenericVideoStream * source = filter->filter;
        uint32_t w = source->getInfo()->width;
        uint32_t h = source->getInfo()->height;
        if (w != width || h != height)
        {
            name = g_strconcat ("XX ", name, " XX", NULL);
            free_name = true;
        }

        printf ("filter [%d] = %s (%d) @ %p; %dx%d\n",
                i, name, filter->tag, source, w, h);
        gtk_combo_box_append_text (GTK_COMBO_BOX (previewOutputMenu), name);
        if (filter->filter == myDialog->getSource())
        {
            gtk_combo_box_set_active (GTK_COMBO_BOX (previewOutputMenu), i);
            printf ("\tfilter [%d] is being configured now\n", i);
            active = i;
        }

        if (free_name)
            g_free (const_cast <char *> (name));
    }

    ADM_assert (active >= 0);
    myDialog->this_filter_index = active;

    g_signal_connect (GTK_OBJECT(previewOutputMenu), "changed",
                      GTK_SIGNAL_FUNC(previewOutputMenuChange),
                      gpointer(myDialog));

    uint8_t ret = 0;
    int response = gtk_dialog_run(GTK_DIALOG(dialog));

    if (response == GTK_RESPONSE_OK)
    {
        myDialog->download();
        myDialog->pushParam();
        ret = 1;
    }
    else
        myDialog->restoreParam();

    gtk_unregister_dialog(dialog);
    gtk_widget_destroy(dialog);

    delete myDialog;

    return ret;
}
Ejemplo n.º 18
0
/*
	Save as with the external mpeg2enc

*/
uint8_t mpegWritter::save_regular(char *name, ADM_MPEGTYPE mpegtype, int qz, int bitrate,int matrix,
					uint8_t interlaced,
					uint8_t bff,        // WLA
					uint8_t widescreen)
{
 uint32_t 		size;
AVDMGenericVideoStream	 *incoming;

FILE			*fd=NULL;
uint64_t		total_size=0;
uint32_t		len,flags;
uint32_t 		outquant;

DIA_encoding		*encoding;

   	incoming = getLastVideoFilter (frameStart,frameEnd-frameStart);
	_total=incoming->getInfo()->nb_frames;
	_fps1000=incoming->getInfo()->fps1000;
	if(!_total) return 0;

	printf("Br:%d, qz:%d\n",bitrate,qz);
	if(!_audio)
	{
		fd=fopen(name,"wb");
		if(!fd)
		{
			GUI_Alert("Problem opening file!");
			return 0;			
		}
	}
	else
	{
		assert(_audioOneFrame);
		assert(_audioBuffer);
		assert(_audioFifo);
		assert(_videoFifo);

	}


	_w=incoming->getInfo()->width;
	_h=incoming->getInfo()->height;
	

 	_page=_w*_h;
	_page+=_page>>1;

//			if(!init(name,ADM_VCD,interlaced,widescreen)) return 0;
	if(!init(name,ADM_VCD,interlaced,bff,widescreen)) return 0; //WLA
	printf("\n mpeg2enc init done \n");


	_buffer	=new uint8_t[_w*_h*2];
	_buffer_out=new uint8_t[_w*_h*2];

	assert(  _buffer);
	assert(  _buffer_out);

	encoding=new DIA_encoding(_fps1000);

	encoding->setPhasis("Encoding.");
	encoding->setFrame(0,_total);
//	printf("Br:%d, qz:%d\n",bitrate,qz);

	switch(mpegtype)
	{
		case ADM_VCD:
					{
					encoding->setCodec("VCD.");
					Mpeg2encVCD *dec;
					dec=new Mpeg2encVCD(_w,_h);
//					dec->init(1,0,_fps1000,interlaced,widescreen);
					dec->init(1,0,_fps1000,interlaced,bff,widescreen); // WLA
					_codec=dec;
					}
					break;
		case ADM_SVCD:

					Mpeg2encSVCD *dec;
					dec=new Mpeg2encSVCD(_w,_h);
					dec->setMatrix(matrix);
//					dec->init(qz,bitrate,_fps1000,interlaced,widescreen);
					dec->init(qz,bitrate,_fps1000,interlaced,bff,widescreen); 
					// WLA
					_codec=dec;
					encoding->setCodec("SVCD.");

					break;

		case ADM_DVD:
				{
					Mpeg2encDVD *dec;
					dec=new Mpeg2encDVD(_w,_h);
					dec->setMatrix(matrix);
//					dec->init(qz,bitrate,_fps1000,interlaced,widescreen);
					dec->init(qz,bitrate,_fps1000,interlaced,bff,widescreen); 
					// WLA
					_codec=dec;
					encoding->setCodec("DVD.");

				}
					break;
		default: assert(0);
	}

	printf("\n--encoding started--\n");
	for(uint32_t i=0;i<_total;i++)
			{
            			if(!incoming->getFrameNumberNoAlloc(i, &size,
					(uint8_t *) _buffer,&flags))
				{
						delete encoding;
               					GUI_Alert("Encoding error !");
						if(fd)
							fclose(fd);
						end();
						return 0 ;
				}
				_codec->encode(	_buffer,_buffer_out , &len,&flags,&outquant);
				total_size+=len;
				encoding->feedFrame(len);
				encoding->setQuant(outquant);
				encoding->setFrame(i,_total);
				// Null frame are only possible
				// when in prefill state for mpeg-X
				if(!len) continue;
				if(_audio)
				{		
				uint32_t audiolen;		
						// write video
						fwrite(_buffer_out,len,1,_videoFifo);
						fflush(_videoFifo);
						audiolen=_audioOneFrame;
						audiolen = _audio->read (audiolen,_audioBuffer);
						assert(audiolen<MAXAUDIO);
						fwrite(_audioBuffer,audiolen,1,_audioFifo);	
						fflush(_audioFifo);
						aprintf("Audio :%lu Video:%lu (%lu)\n",audiolen,len,
							_audioOneFrame);
				}else
				{
					fwrite(_buffer_out,len,1,fd);
					fflush(fd);
				}
									
				aprintf(" outquant %02d  size :%d flags %x\n",outquant,len,flags);
				
				if(!encoding->isAlive())
					{
						delete encoding;
						end();
						if(fd)
						  fclose(fd);
						 return 0;
					}
			}
			encoding->setPhasis("Finishing");
			for(uint32_t i=0;i<MPEG_PREFILL;i++)
			{
				_codec->encode(_buffer,_buffer_out , &len,&flags);
				total_size+=len;
				encoding->feedFrame(len);
				if(!_audio)
					fwrite(_buffer_out,len,1,fd);
				else
				{
					fwrite(_buffer_out,len,1,_videoFifo);
					len=_audioOneFrame;
					len = _audio->read (len, _audioBuffer);
					fwrite(_audioBuffer,len,1,_audioFifo);
				}

				//	printf("\n pipe opened %ld\n",i);
				encoding->setFrame(i,_total);

			}
			delete encoding;
			
			if(!_audio)
				fclose(fd);
			else
			{
				fflush(_audioFifo);
				fflush(_videoFifo);
				if(_audioFifo)
				{
					fclose(_audioFifo);
					_audioFifo=NULL;
				}
				if(_videoFifo)
				{
					fclose(_videoFifo);
					_videoFifo=NULL;
				}
				if(_lvepipe)
				{
					printf("Killing lvemux (main loop)\n");
				 	pclose(_lvepipe);
			 		_lvepipe=NULL;
				}
				deleteAudioFilter();
				_audio=NULL;				
			}
			end();
			return 1;

}