You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	MOV: Support stz2 "Compact Sample Size Box"
Originally committed as revision 18016 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		| @@ -33,6 +33,7 @@ | |||||||
| #include "isom.h" | #include "isom.h" | ||||||
| #include "libavcodec/mpeg4audio.h" | #include "libavcodec/mpeg4audio.h" | ||||||
| #include "libavcodec/mpegaudiodata.h" | #include "libavcodec/mpegaudiodata.h" | ||||||
|  | #include "libavcodec/bitstream.h" | ||||||
|  |  | ||||||
| #if CONFIG_ZLIB | #if CONFIG_ZLIB | ||||||
| #include <zlib.h> | #include <zlib.h> | ||||||
| @@ -1127,14 +1128,23 @@ static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOVAtom atom) | |||||||
| { | { | ||||||
|     AVStream *st = c->fc->streams[c->fc->nb_streams-1]; |     AVStream *st = c->fc->streams[c->fc->nb_streams-1]; | ||||||
|     MOVStreamContext *sc = st->priv_data; |     MOVStreamContext *sc = st->priv_data; | ||||||
|     unsigned int i, entries, sample_size; |     unsigned int i, entries, sample_size, field_size, num_bytes; | ||||||
|  |     GetBitContext gb; | ||||||
|  |     unsigned char* buf; | ||||||
|  |  | ||||||
|     get_byte(pb); /* version */ |     get_byte(pb); /* version */ | ||||||
|     get_be24(pb); /* flags */ |     get_be24(pb); /* flags */ | ||||||
|  |  | ||||||
|  |     if (atom.type == MKTAG('s','t','s','z')) { | ||||||
|     sample_size = get_be32(pb); |     sample_size = get_be32(pb); | ||||||
|     if (!sc->sample_size) /* do not overwrite value computed in stsd */ |     if (!sc->sample_size) /* do not overwrite value computed in stsd */ | ||||||
|         sc->sample_size = sample_size; |         sc->sample_size = sample_size; | ||||||
|  |     field_size = 32; | ||||||
|  |     } else { | ||||||
|  |         sample_size = 0; | ||||||
|  |         get_be24(pb); /* reserved */ | ||||||
|  |         field_size = get_byte(pb); | ||||||
|  |     } | ||||||
|     entries = get_be32(pb); |     entries = get_be32(pb); | ||||||
|  |  | ||||||
|     dprintf(c->fc, "sample_size = %d sample_count = %d\n", sc->sample_size, entries); |     dprintf(c->fc, "sample_size = %d sample_count = %d\n", sc->sample_size, entries); | ||||||
| @@ -1143,14 +1153,37 @@ static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOVAtom atom) | |||||||
|     if (sample_size) |     if (sample_size) | ||||||
|         return 0; |         return 0; | ||||||
|  |  | ||||||
|  |     if (field_size != 4 && field_size != 8 && field_size != 16 && field_size != 32) { | ||||||
|  |         av_log(c->fc, AV_LOG_ERROR, "Invalid sample field size %d\n", field_size); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if(entries >= UINT_MAX / sizeof(int)) |     if(entries >= UINT_MAX / sizeof(int)) | ||||||
|         return -1; |         return -1; | ||||||
|     sc->sample_sizes = av_malloc(entries * sizeof(int)); |     sc->sample_sizes = av_malloc(entries * sizeof(int)); | ||||||
|     if (!sc->sample_sizes) |     if (!sc->sample_sizes) | ||||||
|         return AVERROR(ENOMEM); |         return AVERROR(ENOMEM); | ||||||
|  |  | ||||||
|  |     num_bytes = (entries*field_size+4)>>3; | ||||||
|  |  | ||||||
|  |     buf = av_malloc(num_bytes); | ||||||
|  |     if (!buf) { | ||||||
|  |         av_freep(&sc->sample_sizes); | ||||||
|  |         return AVERROR(ENOMEM); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (get_buffer(pb, buf, num_bytes) < num_bytes) { | ||||||
|  |         av_freep(&sc->sample_sizes); | ||||||
|  |         av_free(buf); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     init_get_bits(&gb, buf, 8*num_bytes); | ||||||
|  |  | ||||||
|     for(i=0; i<entries; i++) |     for(i=0; i<entries; i++) | ||||||
|         sc->sample_sizes[i] = get_be32(pb); |         sc->sample_sizes[i] = get_bits_long(&gb, field_size); | ||||||
|  |  | ||||||
|  |     av_free(buf); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1793,6 +1826,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { | |||||||
| { MKTAG('s','t','s','s'), mov_read_stss }, /* sync sample */ | { MKTAG('s','t','s','s'), mov_read_stss }, /* sync sample */ | ||||||
| { MKTAG('s','t','s','z'), mov_read_stsz }, /* sample size */ | { MKTAG('s','t','s','z'), mov_read_stsz }, /* sample size */ | ||||||
| { MKTAG('s','t','t','s'), mov_read_stts }, | { MKTAG('s','t','t','s'), mov_read_stts }, | ||||||
|  | { MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */ | ||||||
| { MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */ | { MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */ | ||||||
| { MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */ | { MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */ | ||||||
| { MKTAG('t','r','a','k'), mov_read_trak }, | { MKTAG('t','r','a','k'), mov_read_trak }, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user