[Theora] ffmpeg2theora start and end time support - patch

Nilesh Bansal bansal at cs.ubc.ca
Sat Nov 20 14:15:21 PST 2004


After posting my previous mail, I realized that i should instead post a 
patch against HEAD. This is because v0.12 was released while I was also 
changing ffmpeg2theora.c from v0.11. So please use this patch instead and 
apply it to version at http://svn.xiph.org/trunk/ffmpeg2theora

Nilesh Bansal
http://www.cse.iitb.ac.in/nilesh/
-------------- next part --------------
Index: ffmpeg2theora.c
===================================================================
--- ffmpeg2theora.c	(revision 8237)
+++ ffmpeg2theora.c	(working copy)
@@ -76,6 +76,9 @@
 	int video_y;
 	int frame_x_offset;
 	int frame_y_offset;
+
+	int start_time; /* In seconds */
+        int end_time; /* In seconds */
 }
 *ff2theora;
 
@@ -128,7 +131,8 @@
 		this->frame_bottomBand=0;
 		this->frame_leftBand=0;
 		this->frame_rightBand=0;
-
+		this->start_time=0;
+                this->end_time=0; /* ZERO denotes no end time set */
 	}
 	return this;
 }
@@ -142,7 +146,7 @@
 	AVCodec *acodec = NULL;
 	AVCodec *vcodec = NULL;
 	float frame_aspect;
-	
+	int frame_number=0;
 	double fps = 0.0;
 
 	for (i = 0; i < this->context->nb_streams; i++){
@@ -426,9 +430,23 @@
 		info.vorbis_quality = this->audio_quality;
 		info.vorbis_bitrate = this->audio_bitrate;
 		theoraframes_init (&info);
-	
+		/*seek to start time*/	
+		av_seek_frame( this->context, -1, (int64_t)AV_TIME_BASE*this->start_time, 1);
+		/*check for end time and caclulate number of frames to encode*/
+		int no_frames = fps*(this->end_time - this->start_time);
+                if(this->end_time > 0 && no_frames < 0){
+                        printf("Error -- end time < start time\n");
+                        exit(1);
+                }
+
 		/* main decoding loop */
-		do{
+		do{	
+			if(no_frames > 0){
+                                if(frame_number > no_frames){
+                                        printf("\nTime to break\n");
+                                        break;
+                                }
+                        }
 			ret = av_read_frame(this->context,&pkt);
 			if(ret<0){
 				e_o_s=1;
@@ -449,6 +467,9 @@
 						//FIXME: move image resize/deinterlace/colorformat transformation
 						//			into seperate function
 						if(got_picture){
+                                                        //For audio only files command line option"-e" will not work
+                                                        //as we donot increment frame_number in audio section.
+							frame_number++;
 							//FIXME: better colorformat transformation to YUV420P
 							/* might have to cast other progressive formats here */
 							//if(venc->pix_fmt != PIX_FMT_YUV420P){
@@ -644,6 +665,8 @@
 		"\t --audiobitrate,-A\t[45 to 2000] encoding bitrate for audio\n"
 		"\t --samplerate,-H\tset output samplerate in Hz\n"
 		"\t --nosound\t\tdisable the sound from input\n"
+		"\t --endtime,-e\t\tend encoding at this time (in sec)\n"
+                "\t --starttime,-s\t\tstart encoding at this time (in sec)\n"
 		"\t --v2v-preset,-p\tencode file with v2v preset, \n"
 		"\t\t\t\t right now there is preview and pro,\n"
 		"\t\t\t\t '"PACKAGE" -p info' for more informations\n"
@@ -704,7 +727,7 @@
 	av_register_all ();
 	
 	int c,long_option_index;
-	const char *optstring = "o:f:x:y:v:V:a:A:d:H:c:p:N:D:h::";
+	const char *optstring = "o:f:x:y:v:V:a:s:e:A:d:H:c:p:N:D:h::";
 	struct option options [] = {
 	  {"output",required_argument,NULL,'o'},
 	  {"format",required_argument,NULL,'f'},
@@ -726,6 +749,8 @@
 	  {"cropright",required_argument,&cropright_flag,1},
 	  {"cropleft",required_argument,&cropleft_flag,1},
 	  {"inputfps",required_argument,&inputfps_flag,1},
+	  {"starttime",required_argument,NULL,'s'},
+          {"endtime",required_argument,NULL,'e'},
 
 	  {"artist",required_argument,&metadata_flag,10},
 	  {"title",required_argument,&metadata_flag,11},
@@ -807,6 +832,12 @@
 					metadata_flag=0;
 				}
 				break;
+			case 'e':
+                                convert->end_time = atoi(optarg);
+                                break;
+			case 's':
+                                convert->start_time = atoi(optarg);
+                                break;
 			case 'o':
 				sprintf(outputfile_name,optarg);
 				outputfile_set=1;


More information about the Theora mailing list