mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 04:26:37 +08:00 
			
		
		
		
	oggvorbisdec: redesign special handling of first frames timestamp.
This also will make it possible to use the code for cases other than the start of a stream Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		| @@ -226,6 +226,7 @@ int avpriv_vorbis_parse_frame(VorbisParseContext *s, const uint8_t *buf, | ||||
|             previous_blocksize = s->blocksize[flag]; | ||||
|         } | ||||
|         current_blocksize     = s->mode_blocksize[mode]; | ||||
|         if(previous_blocksize) | ||||
|             duration              = (previous_blocksize + current_blocksize) >> 2; | ||||
|         s->previous_blocksize = current_blocksize; | ||||
|     } | ||||
| @@ -236,7 +237,7 @@ int avpriv_vorbis_parse_frame(VorbisParseContext *s, const uint8_t *buf, | ||||
| void avpriv_vorbis_parse_reset(VorbisParseContext *s) | ||||
| { | ||||
|     if (s->valid_extradata) | ||||
|         s->previous_blocksize = s->mode_blocksize[0]; | ||||
|         s->previous_blocksize = 0; | ||||
| } | ||||
|  | ||||
| #if CONFIG_VORBIS_PARSER | ||||
|   | ||||
| @@ -297,28 +297,33 @@ static int vorbis_packet(AVFormatContext *s, int idx) | ||||
|        the total duration to the page granule to find the encoder delay and | ||||
|        set the first timestamp */ | ||||
|     if (!os->lastpts) { | ||||
|         int seg; | ||||
|         int seg, d; | ||||
|         uint8_t *last_pkt = os->buf + os->pstart; | ||||
|         uint8_t *next_pkt = last_pkt; | ||||
|         int first_duration = 0; | ||||
|  | ||||
|         avpriv_vorbis_parse_reset(&priv->vp); | ||||
|         duration = 0; | ||||
|         for (seg = 0; seg < os->nsegs; seg++) { | ||||
|         seg = os->segp; | ||||
|         d = avpriv_vorbis_parse_frame(&priv->vp, last_pkt, 1); | ||||
|         if (d < 0) { | ||||
|             os->pflags |= AV_PKT_FLAG_CORRUPT; | ||||
|             return 0; | ||||
|         } | ||||
|         duration += d; | ||||
|         last_pkt = next_pkt =  next_pkt + os->psize; | ||||
|         for (; seg < os->nsegs; seg++) { | ||||
|             if (os->segments[seg] < 255) { | ||||
|                 int d = avpriv_vorbis_parse_frame(&priv->vp, last_pkt, 1); | ||||
|                 if (d < 0) { | ||||
|                     duration = os->granule; | ||||
|                     break; | ||||
|                 } | ||||
|                 if (!duration) | ||||
|                     first_duration = d; | ||||
|                 duration += d; | ||||
|                 last_pkt = next_pkt + os->segments[seg]; | ||||
|             } | ||||
|             next_pkt += os->segments[seg]; | ||||
|         } | ||||
|         os->lastpts = os->lastdts   = os->granule - duration + first_duration; | ||||
|         os->lastpts = os->lastdts   = os->granule - duration; | ||||
|         s->streams[idx]->start_time = os->lastpts; | ||||
|         if (s->streams[idx]->duration) | ||||
|             s->streams[idx]->duration -= s->streams[idx]->start_time; | ||||
| @@ -329,7 +334,7 @@ static int vorbis_packet(AVFormatContext *s, int idx) | ||||
|     /* parse packet duration */ | ||||
|     if (os->psize > 0) { | ||||
|         duration = avpriv_vorbis_parse_frame(&priv->vp, os->buf + os->pstart, 1); | ||||
|         if (duration <= 0) { | ||||
|         if (duration < 0) { | ||||
|             os->pflags |= AV_PKT_FLAG_CORRUPT; | ||||
|             return 0; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Michael Niedermayer
					Michael Niedermayer