Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 25 Sep 2011 21:30:25 +0000 (23:30 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 25 Sep 2011 21:30:25 +0000 (23:30 +0200)
* qatar/master:
  ppc: fix some pointer to integer casts
  ppc: fix 32-bit PIC build
  vmdaudio: fix decoding of 16-bit audio format.
  lavf: do not set codec_tag for rawvideo
  h264: check for out of bounds reads in ff_h264_decode_extradata().
  flvdec: Check for overflow before allocating arrays
  avconv: use correct output stream index when checking max_frames
  avconv: remove fake coded_frame on streamcopy hack

Conflicts:
avconv.c
libavcodec/h264.c
libavcodec/ppc/asm.S
libavcodec/vmdav.c
libavformat/flvdec.c
libavformat/utils.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
avconv.c
ffmpeg.c
libavcodec/ppc/asm.S
libavcodec/ppc/fft_altivec_s.S
libavcodec/vmdav.c
libswscale/ppc/swscale_altivec.c

diff --cc avconv.c
+++ b/avconv.c
@@@ -1826,10 -1755,9 +1826,9 @@@ static int output_packet(InputStream *i
                          abort();
                      }
                  } else {
-                     AVFrame avframe; //FIXME/XXX remove this
 +                    AVPicture pict;
                      AVPacket opkt;
                      int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
 -
                      av_init_packet(&opkt);
  
                      if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
diff --cc ffmpeg.c
+++ b/ffmpeg.c
@@@ -1784,141 -1639,120 +1784,136 @@@ static int output_packet(InputStream *i
          }
          /* if output time reached then transcode raw format,
             encode packets and output them */
 -        if (start_time == 0 || ist->pts >= start_time)
 -            for(i=0;i<nb_ostreams;i++) {
 -                int frame_size;
 +        for (i = 0; i < nb_ostreams; i++) {
 +            OutputFile *of = &output_files[ost_table[i].file_index];
 +            int frame_size;
 +
 +            ost = &ost_table[i];
 +            if (ost->source_index != ist_index)
 +                continue;
 +
 +            if (of->start_time && ist->pts < of->start_time)
 +                continue;
 +
 +            if (of->recording_time != INT64_MAX &&
 +                av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
 +                              (AVRational){1, 1000000}) >= 0) {
 +                ost->is_past_recording_time = 1;
 +                continue;
 +            }
  
 -                ost = ost_table[i];
 -                if (ost->source_index == ist_index) {
  #if CONFIG_AVFILTER
 -                frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
 -                    !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
 -                while (frame_available) {
 -                    AVRational ist_pts_tb;
 -                    if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
 -                        get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
 -                    if (ost->picref)
 +            frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
 +                !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
 +            while (frame_available) {
 +                if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
 +                    AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
 +                    if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
 +                        goto cont;
 +                    if (ost->picref) {
 +                        avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
                          ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
 +                    }
 +                }
  #endif
 -                    os = output_files[ost->file_index];
 -
 -                    /* set the input output pts pairs */
 -                    //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
 -
 -                    if (ost->encoding_needed) {
 -                        av_assert0(ist->decoding_needed);
 -                        switch(ost->st->codec->codec_type) {
 -                        case AVMEDIA_TYPE_AUDIO:
 -                            do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
 -                            break;
 -                        case AVMEDIA_TYPE_VIDEO:
 +                os = output_files[ost->file_index].ctx;
 +
 +                /* set the input output pts pairs */
 +                //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
 +
 +                if (ost->encoding_needed) {
 +                    av_assert0(ist->decoding_needed);
 +                    switch(ost->st->codec->codec_type) {
 +                    case AVMEDIA_TYPE_AUDIO:
 +                        do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
 +                        break;
 +                    case AVMEDIA_TYPE_VIDEO:
  #if CONFIG_AVFILTER
 -                            if (ost->picref->video && !ost->frame_aspect_ratio)
 -                                ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
 +                        if (ost->picref->video && !ost->frame_aspect_ratio)
 +                            ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
  #endif
 -                            do_video_out(os, ost, ist, &picture, &frame_size,
 -                                         same_quality ? quality : ost->st->codec->global_quality);
 -                            if (vstats_filename && frame_size)
 -                                do_video_stats(os, ost, frame_size);
 -                            break;
 -                        case AVMEDIA_TYPE_SUBTITLE:
 -                            do_subtitle_out(os, ost, ist, &subtitle,
 -                                            pkt->pts);
 -                            break;
 -                        default:
 -                            abort();
 -                        }
 -                    } else {
 -                        AVFrame avframe; //FIXME/XXX remove this
 -                        AVPacket opkt;
 -                        int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
 -
 -                        av_init_packet(&opkt);
 +                        do_video_out(os, ost, ist, &picture, &frame_size,
 +                                        same_quant ? quality : ost->st->codec->global_quality);
 +                        if (vstats_filename && frame_size)
 +                            do_video_stats(os, ost, frame_size);
 +                        break;
 +                    case AVMEDIA_TYPE_SUBTITLE:
 +                        do_subtitle_out(os, ost, ist, &subtitle,
 +                                        pkt->pts);
 +                        break;
 +                    default:
 +                        abort();
 +                    }
 +                } else {
-                     AVFrame avframe; //FIXME/XXX remove this
 +                    AVPicture pict;
 +                    AVPacket opkt;
 +                    int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
 +                    av_init_packet(&opkt);
  
 -                        if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
 +                    if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
  #if !CONFIG_AVFILTER
 -                            continue;
 +                        continue;
  #else
 -                            goto cont;
 +                        goto cont;
  #endif
  
 -                        /* no reencoding needed : output the packet directly */
 -                        /* force the input stream PTS */
 +                    /* no reencoding needed : output the packet directly */
 +                    /* force the input stream PTS */
  
-                     avcodec_get_frame_defaults(&avframe);
-                     ost->st->codec->coded_frame= &avframe;
-                     avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
 -                        avcodec_get_frame_defaults(&avframe);
 -                        ost->st->codec->coded_frame= &avframe;
 -                        avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
 +                    if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
 +                        audio_size += data_size;
 +                    else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
 +                        video_size += data_size;
 +                        ost->sync_opts++;
 +                    }
  
 -                        if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
 -                            audio_size += data_size;
 -                        else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
 -                            video_size += data_size;
 -                            ost->sync_opts++;
 -                        }
 +                    opkt.stream_index= ost->index;
 +                    if(pkt->pts != AV_NOPTS_VALUE)
 +                        opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
 +                    else
 +                        opkt.pts= AV_NOPTS_VALUE;
  
 -                        opkt.stream_index= ost->index;
 -                        if(pkt->pts != AV_NOPTS_VALUE)
 -                            opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
 -                        else
 -                            opkt.pts= AV_NOPTS_VALUE;
 -
 -                        if (pkt->dts == AV_NOPTS_VALUE)
 -                            opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
 -                        else
 -                            opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
 -                        opkt.dts -= ost_tb_start_time;
 -
 -                        opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
 -                        opkt.flags= pkt->flags;
 -
 -                        //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
 -                        if(   ost->st->codec->codec_id != CODEC_ID_H264
 -                           && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
 -                           && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
 -                           ) {
 -                            if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
 -                                opkt.destruct= av_destruct_packet;
 -                        } else {
 -                            opkt.data = data_buf;
 -                            opkt.size = data_size;
 -                        }
 +                    if (pkt->dts == AV_NOPTS_VALUE)
 +                        opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
 +                    else
 +                        opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
 +                    opkt.dts -= ost_tb_start_time;
 +
 +                    opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
 +                    opkt.flags= pkt->flags;
 +
 +                    //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
 +                    if(   ost->st->codec->codec_id != CODEC_ID_H264
 +                       && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
 +                       && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
 +                       ) {
 +                        if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
 +                            opkt.destruct= av_destruct_packet;
 +                    } else {
 +                        opkt.data = data_buf;
 +                        opkt.size = data_size;
 +                    }
  
 -                        write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
 -                        ost->st->codec->frame_number++;
 -                        ost->frame_number++;
 -                        av_free_packet(&opkt);
 +                    if (os->oformat->flags & AVFMT_RAWPICTURE) {
 +                        /* store AVPicture in AVPacket, as expected by the output format */
 +                        avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
 +                        opkt.data = (uint8_t *)&pict;
 +                        opkt.size = sizeof(AVPicture);
 +                        opkt.flags |= AV_PKT_FLAG_KEY;
                      }
 -#if CONFIG_AVFILTER
 -                    cont:
 -                    frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
 -                                       ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
 -                    if (ost->picref)
 -                        avfilter_unref_buffer(ost->picref);
 -                }
 -#endif
 +                    write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
 +                    ost->st->codec->frame_number++;
 +                    ost->frame_number++;
 +                    av_free_packet(&opkt);
                  }
 +#if CONFIG_AVFILTER
 +                cont:
 +                frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
 +                                   ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
 +                avfilter_unref_buffer(ost->picref);
              }
 +#endif
 +        }
  
          av_free(buffer_to_free);
          /* XXX: allocate the subtitles in the codec ? */
@@@ -2501,11 -2556,9 +2496,11 @@@ static int transcode(OutputFile *output
                      if(!input_sync) file_index = ist->file_index;
                  }
              }
 -            if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
 -                file_index= -1;
 -                break;
 +            if (ost->frame_number >= ost->max_frames) {
 +                int j;
-                 for (j = of->ost_index; j < of->ctx->nb_streams; j++)
-                     output_streams[j].is_past_recording_time = 1;
++                for (j = 0; j < of->ctx->nb_streams; j++)
++                    output_streams[of->ost_index + j].is_past_recording_time = 1;
 +                continue;
              }
          }
          /* if none, if is finished */
Simple merge
Simple merge
Simple merge
Simple merge