movenc: small refactor mov_write_packet
Share the formerly internal write_packet with the hinter and move the fragment flush logic to the user facing one since it is not concerned about movtrack-only streams. Fixes bug #263 Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
		
							parent
							
								
									18b59956e0
								
							
						
					
					
						commit
						ebbede2265
					
				@ -2805,7 +2805,7 @@ static int mov_flush_fragment(AVFormatContext *s)
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int mov_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
 | 
			
		||||
int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
 | 
			
		||||
{
 | 
			
		||||
    MOVMuxContext *mov = s->priv_data;
 | 
			
		||||
    AVIOContext *pb = s->pb;
 | 
			
		||||
@ -2814,23 +2814,6 @@ static int mov_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
 | 
			
		||||
    unsigned int samples_in_chunk = 0;
 | 
			
		||||
    int size= pkt->size;
 | 
			
		||||
    uint8_t *reformatted_data = NULL;
 | 
			
		||||
    int64_t frag_duration = 0;
 | 
			
		||||
 | 
			
		||||
    if (!size) return 0; /* Discard 0 sized packets */
 | 
			
		||||
 | 
			
		||||
    if (trk->entry)
 | 
			
		||||
        frag_duration = av_rescale_q(pkt->dts - trk->cluster[0].dts,
 | 
			
		||||
                                     s->streams[pkt->stream_index]->time_base,
 | 
			
		||||
                                     AV_TIME_BASE_Q);
 | 
			
		||||
    if ((mov->max_fragment_duration &&
 | 
			
		||||
         frag_duration >= mov->max_fragment_duration) ||
 | 
			
		||||
         (mov->max_fragment_size && mov->mdat_size + size >= mov->max_fragment_size) ||
 | 
			
		||||
         (mov->flags & FF_MOV_FLAG_FRAG_KEYFRAME &&
 | 
			
		||||
          enc->codec_type == AVMEDIA_TYPE_VIDEO &&
 | 
			
		||||
          trk->entry && pkt->flags & AV_PKT_FLAG_KEY)) {
 | 
			
		||||
        if (frag_duration >= mov->min_fragment_duration)
 | 
			
		||||
            mov_flush_fragment(s);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (mov->flags & FF_MOV_FLAG_FRAGMENT) {
 | 
			
		||||
        int ret;
 | 
			
		||||
@ -2956,13 +2939,35 @@ static int mov_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
 | 
			
		||||
static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
 | 
			
		||||
{
 | 
			
		||||
    if (!pkt) {
 | 
			
		||||
        mov_flush_fragment(s);
 | 
			
		||||
        return 1;
 | 
			
		||||
    } else {
 | 
			
		||||
        return mov_write_packet_internal(s, pkt);
 | 
			
		||||
        MOVMuxContext *mov = s->priv_data;
 | 
			
		||||
        MOVTrack *trk = &mov->tracks[pkt->stream_index];
 | 
			
		||||
        AVCodecContext *enc = trk->enc;
 | 
			
		||||
        int64_t frag_duration = 0;
 | 
			
		||||
        int size = pkt->size;
 | 
			
		||||
 | 
			
		||||
        if (!pkt->size) return 0; /* Discard 0 sized packets */
 | 
			
		||||
 | 
			
		||||
        if (trk->entry)
 | 
			
		||||
            frag_duration = av_rescale_q(pkt->dts - trk->cluster[0].dts,
 | 
			
		||||
                                         s->streams[pkt->stream_index]->time_base,
 | 
			
		||||
                                         AV_TIME_BASE_Q);
 | 
			
		||||
        if ((mov->max_fragment_duration &&
 | 
			
		||||
             frag_duration >= mov->max_fragment_duration) ||
 | 
			
		||||
             (mov->max_fragment_size && mov->mdat_size + size >= mov->max_fragment_size) ||
 | 
			
		||||
             (mov->flags & FF_MOV_FLAG_FRAG_KEYFRAME &&
 | 
			
		||||
              enc->codec_type == AVMEDIA_TYPE_VIDEO &&
 | 
			
		||||
              trk->entry && pkt->flags & AV_PKT_FLAG_KEY)) {
 | 
			
		||||
            if (frag_duration >= mov->min_fragment_duration)
 | 
			
		||||
                mov_flush_fragment(s);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ff_mov_write_packet(s, pkt);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3274,7 +3279,7 @@ AVOutputFormat ff_mov_muxer = {
 | 
			
		||||
    .video_codec       = CODEC_ID_MPEG4,
 | 
			
		||||
#endif
 | 
			
		||||
    .write_header      = mov_write_header,
 | 
			
		||||
    .write_packet      = ff_mov_write_packet,
 | 
			
		||||
    .write_packet      = mov_write_packet,
 | 
			
		||||
    .write_trailer     = mov_write_trailer,
 | 
			
		||||
    .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH,
 | 
			
		||||
    .codec_tag         = (const AVCodecTag* const []){
 | 
			
		||||
@ -3293,7 +3298,7 @@ AVOutputFormat ff_tgp_muxer = {
 | 
			
		||||
    .audio_codec       = CODEC_ID_AMR_NB,
 | 
			
		||||
    .video_codec       = CODEC_ID_H263,
 | 
			
		||||
    .write_header      = mov_write_header,
 | 
			
		||||
    .write_packet      = ff_mov_write_packet,
 | 
			
		||||
    .write_packet      = mov_write_packet,
 | 
			
		||||
    .write_trailer     = mov_write_trailer,
 | 
			
		||||
    .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH,
 | 
			
		||||
    .codec_tag         = (const AVCodecTag* const []){ codec_3gp_tags, 0 },
 | 
			
		||||
@ -3315,7 +3320,7 @@ AVOutputFormat ff_mp4_muxer = {
 | 
			
		||||
    .video_codec       = CODEC_ID_MPEG4,
 | 
			
		||||
#endif
 | 
			
		||||
    .write_header      = mov_write_header,
 | 
			
		||||
    .write_packet      = ff_mov_write_packet,
 | 
			
		||||
    .write_packet      = mov_write_packet,
 | 
			
		||||
    .write_trailer     = mov_write_trailer,
 | 
			
		||||
    .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH,
 | 
			
		||||
    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
 | 
			
		||||
@ -3336,7 +3341,7 @@ AVOutputFormat ff_psp_muxer = {
 | 
			
		||||
    .video_codec       = CODEC_ID_MPEG4,
 | 
			
		||||
#endif
 | 
			
		||||
    .write_header      = mov_write_header,
 | 
			
		||||
    .write_packet      = ff_mov_write_packet,
 | 
			
		||||
    .write_packet      = mov_write_packet,
 | 
			
		||||
    .write_trailer     = mov_write_trailer,
 | 
			
		||||
    .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH,
 | 
			
		||||
    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
 | 
			
		||||
@ -3353,7 +3358,7 @@ AVOutputFormat ff_tg2_muxer = {
 | 
			
		||||
    .audio_codec       = CODEC_ID_AMR_NB,
 | 
			
		||||
    .video_codec       = CODEC_ID_H263,
 | 
			
		||||
    .write_header      = mov_write_header,
 | 
			
		||||
    .write_packet      = ff_mov_write_packet,
 | 
			
		||||
    .write_packet      = mov_write_packet,
 | 
			
		||||
    .write_trailer     = mov_write_trailer,
 | 
			
		||||
    .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH,
 | 
			
		||||
    .codec_tag         = (const AVCodecTag* const []){ codec_3gp_tags, 0 },
 | 
			
		||||
@ -3371,7 +3376,7 @@ AVOutputFormat ff_ipod_muxer = {
 | 
			
		||||
    .audio_codec       = CODEC_ID_AAC,
 | 
			
		||||
    .video_codec       = CODEC_ID_H264,
 | 
			
		||||
    .write_header      = mov_write_header,
 | 
			
		||||
    .write_packet      = ff_mov_write_packet,
 | 
			
		||||
    .write_packet      = mov_write_packet,
 | 
			
		||||
    .write_trailer     = mov_write_trailer,
 | 
			
		||||
    .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH,
 | 
			
		||||
    .codec_tag         = (const AVCodecTag* const []){ codec_ipod_tags, 0 },
 | 
			
		||||
@ -3389,7 +3394,7 @@ AVOutputFormat ff_ismv_muxer = {
 | 
			
		||||
    .audio_codec       = CODEC_ID_AAC,
 | 
			
		||||
    .video_codec       = CODEC_ID_H264,
 | 
			
		||||
    .write_header      = mov_write_header,
 | 
			
		||||
    .write_packet      = ff_mov_write_packet,
 | 
			
		||||
    .write_packet      = mov_write_packet,
 | 
			
		||||
    .write_trailer     = mov_write_trailer,
 | 
			
		||||
    .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH,
 | 
			
		||||
    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user