You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavf/mov.c: Add -advanced_editlist option for mov format.
Adding an MOV format option to turn on/off the editlist supporting code, introduced in ca6cae73db
Signed-off-by: Sasi Inguva <isasi@google.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
			
			
This commit is contained in:
		
				
					committed by
					
						 Michael Niedermayer
						Michael Niedermayer
					
				
			
			
				
	
			
			
			
						parent
						
							58b867a7cf
						
					
				
				
					commit
					ef71dc7948
				
			| @@ -234,6 +234,7 @@ typedef struct MOVContext { | ||||
|     unsigned int nb_chapter_tracks; | ||||
|     int use_absolute_path; | ||||
|     int ignore_editlist; | ||||
|     int advanced_editlist; | ||||
|     int ignore_chapters; | ||||
|     int seek_individually; | ||||
|     int64_t next_root_atom; ///< offset of the next root atom | ||||
|   | ||||
| @@ -3309,7 +3309,7 @@ static void mov_build_index(MOVContext *mov, AVStream *st) | ||||
|     uint64_t stream_size = 0; | ||||
|  | ||||
|     if (sc->elst_count) { | ||||
|         int i, edit_start_index = 0; | ||||
|         int i, edit_start_index = 0, multiple_edits = 0; | ||||
|         int64_t empty_duration = 0; // empty duration of the first edit list entry | ||||
|         int64_t start_time = 0; // start time of the media | ||||
|  | ||||
| @@ -3322,15 +3322,28 @@ static void mov_build_index(MOVContext *mov, AVStream *st) | ||||
|                 edit_start_index = 1; | ||||
|             } else if (i == edit_start_index && e->time >= 0) { | ||||
|                 start_time = e->time; | ||||
|             } else { | ||||
|                 multiple_edits = 1; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (multiple_edits && !mov->advanced_editlist) | ||||
|             av_log(mov->fc, AV_LOG_WARNING, "multiple edit list entries, " | ||||
|                    "Use -advanced_editlist to correctly decode otherwise " | ||||
|                    "a/v desync might occur\n"); | ||||
|  | ||||
|         /* adjust first dts according to edit list */ | ||||
|         if ((empty_duration || start_time) && mov->time_scale > 0) { | ||||
|             if (empty_duration) | ||||
|                 empty_duration = av_rescale(empty_duration, sc->time_scale, mov->time_scale); | ||||
|             sc->time_offset = start_time - empty_duration; | ||||
|             if (!mov->advanced_editlist) | ||||
|                 current_dts = -sc->time_offset; | ||||
|         } | ||||
|  | ||||
|         if (!multiple_edits && !mov->advanced_editlist && | ||||
|             st->codecpar->codec_id == AV_CODEC_ID_AAC && start_time > 0) | ||||
|             sc->start_pad = start_time; | ||||
|     } | ||||
|  | ||||
|     /* only use old uncompressed audio chunk demuxing when stts specifies it */ | ||||
| @@ -3564,8 +3577,10 @@ static void mov_build_index(MOVContext *mov, AVStream *st) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Fix index according to edit lists. | ||||
|     mov_fix_index(mov, st); | ||||
|     if (!mov->ignore_editlist && mov->advanced_editlist) { | ||||
|         // Fix index according to edit lists. | ||||
|         mov_fix_index(mov, st); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static int test_same_origin(const char *src, const char *ref) { | ||||
| @@ -6478,7 +6493,11 @@ static const AVOption mov_options[] = { | ||||
|         "Seek each stream individually to the to the closest point", | ||||
|         OFFSET(seek_individually), AV_OPT_TYPE_BOOL, { .i64 = 1 }, | ||||
|         0, 1, FLAGS}, | ||||
|     {"ignore_editlist", "", OFFSET(ignore_editlist), AV_OPT_TYPE_BOOL, {.i64 = 0}, | ||||
|     {"ignore_editlist", "Ignore the edit list atom.", OFFSET(ignore_editlist), AV_OPT_TYPE_BOOL, {.i64 = 0}, | ||||
|         0, 1, FLAGS}, | ||||
|     {"advanced_editlist", | ||||
|         "Modify the AVIndex according to the editlists. Use this option to decode in the order specified by the edits.", | ||||
|         OFFSET(advanced_editlist), AV_OPT_TYPE_BOOL, {.i64 = 1}, | ||||
|         0, 1, FLAGS}, | ||||
|     {"ignore_chapters", "", OFFSET(ignore_chapters), AV_OPT_TYPE_BOOL, {.i64 = 0}, | ||||
|         0, 1, FLAGS}, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user