2016-10-27 15:34 GMT+08:00 Rodger Combs <rodger.co...@gmail.com>: > > > On Oct 27, 2016, at 02:07, Steven Liu <lingjiujia...@gmail.com> wrote: > > > > 2016-10-27 15:01 GMT+08:00 Steven Liu <lingjiujia...@gmail.com <mailto: > lingjiujia...@gmail.com>>: > > > >> > >> > >> 2016-10-27 14:52 GMT+08:00 Rodger Combs <rodger.co...@gmail.com>: > >> > >>> > >>>> On Oct 27, 2016, at 01:41, Steven Liu <lingjiujia...@gmail.com> > wrote: > >>>> > >>>> 2016-10-27 14:16 GMT+08:00 Rodger Combs <rodger.co...@gmail.com>: > >>>> > >>>>> --- > >>>>> libavformat/segment.c | 40 +++++++++++++++++++++++++++++++++++++++- > >>>>> 1 file changed, 39 insertions(+), 1 deletion(-) > >>>>> > >>>>> diff --git a/libavformat/segment.c b/libavformat/segment.c > >>>>> index 868f0a8..9b3dc17 100644 > >>>>> --- a/libavformat/segment.c > >>>>> +++ b/libavformat/segment.c > >>>>> @@ -798,9 +798,26 @@ static int seg_write_header(AVFormatContext *s) > >>>>> { > >>>>> SegmentContext *seg = s->priv_data; > >>>>> AVFormatContext *oc = seg->avf; > >>>>> - int ret; > >>>>> + int ret, i; > >>>>> > >>>>> if (!seg->header_written) { > >>>>> + for (i = 0; i < s->nb_streams; i++) { > >>>>> + AVStream *st = oc->streams[i]; > >>>>> + AVCodecParameters *ipar, *opar; > >>>>> + > >>>>> + ipar = s->streams[i]->codecpar; > >>>>> + opar = oc->streams[i]->codecpar; > >>>>> + avcodec_parameters_copy(opar, ipar); > >>>>> + if (!oc->oformat->codec_tag || > >>>>> + av_codec_get_id (oc->oformat->codec_tag, > >>> ipar->codec_tag) > >>>>> == opar->codec_id || > >>>>> + av_codec_get_tag(oc->oformat->codec_tag, > >>> ipar->codec_id) > >>>>> <= 0) { > >>>>> + opar->codec_tag = ipar->codec_tag; > >>>>> + } else { > >>>>> + opar->codec_tag = 0; > >>>>> + } > >>>>> + st->sample_aspect_ratio = s->streams[i]->sample_aspect_r > >>> atio; > >>>>> + st->time_base = s->streams[i]->time_base; > >>>>> + } > >>>>> ret = avformat_write_header(oc, NULL); > >>>>> if (ret < 0) > >>>>> return ret; > >>>>> @@ -978,6 +995,25 @@ fail: > >>>>> return ret; > >>>>> } > >>>>> > >>>>> +static int seg_check_bitstream(struct AVFormatContext *s, const > >>> AVPacket > >>>>> *pkt) > >>>>> +{ > >>>>> + SegmentContext *seg = s->priv_data; > >>>>> + AVFormatContext *oc = seg->avf; > >>>>> + if (oc->oformat->check_bitstream) { > >>>>> + int ret = oc->oformat->check_bitstream(oc, pkt); > >>>>> + if (ret == 1) { > >>>>> + AVStream *st = s->streams[pkt->stream_index]; > >>>>> + AVStream *ost = oc->streams[pkt->stream_index]; > >>>>> + st->internal->bsfcs = ost->internal->bsfcs; > >>>>> + st->internal->nb_bsfcs = ost->internal->nb_bsfcs; > >>>>> + ost->internal->bsfcs = NULL; > >>>>> + ost->internal->nb_bsfcs = 0; > >>>>> + } > >>>>> + return ret; > >>>>> + } > >>>>> + return 1; > >>>>> +} > >>>>> + > >>>>> #define OFFSET(x) offsetof(SegmentContext, x) > >>>>> #define E AV_OPT_FLAG_ENCODING_PARAM > >>>>> static const AVOption options[] = { > >>>>> @@ -1041,6 +1077,7 @@ AVOutputFormat ff_segment_muxer = { > >>>>> .write_packet = seg_write_packet, > >>>>> .write_trailer = seg_write_trailer, > >>>>> .deinit = seg_free, > >>>>> + .check_bitstream = seg_check_bitstream, > >>>>> .priv_class = &seg_class, > >>>>> }; > >>>>> > >>>>> @@ -1061,5 +1098,6 @@ AVOutputFormat ff_stream_segment_muxer = { > >>>>> .write_packet = seg_write_packet, > >>>>> .write_trailer = seg_write_trailer, > >>>>> .deinit = seg_free, > >>>>> + .check_bitstream = seg_check_bitstream, > >>>>> .priv_class = &sseg_class, > >>>>> }; > >>>>> -- > >>>>> 2.10.0 > >>>>> > >>>>> _______________________________________________ > >>>>> ffmpeg-devel mailing list > >>>>> ffmpeg-devel@ffmpeg.org > >>>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > >>>> > >>>> > >>>> This is move to usual area by Michael > >>>> you can refer to commit id: e29d2d9c92e19b0caf05a2064d132ccdecdfc3d5 > >>>> and > >>>> de9674c5eacc076894bd0f94bee0001ba6ab8344 > >>> > >>> See 45f5c5573203a48acb2dd6fbf18f4b0c25b7aff0 (which accidentally > breaks > >>> autobsf for segment [patch was written before > e29d2d9c92e19b0caf05a2064d132c > >>> cdecdfc3d5]). > >>> This is necessary for the separate-header-file functionality to work. > >>> > >> refer to http://ffmpeg.org/pipermail/ffmpeg-devel/2016-June/196016.html > >> > >>> > >>>> _______________________________________________ > >>>> ffmpeg-devel mailing list > >>>> ffmpeg-devel@ffmpeg.org > >>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > >>> > >>> _______________________________________________ > >>> ffmpeg-devel mailing list > >>> ffmpeg-devel@ffmpeg.org > >>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > >>> > >> > > > > Maybe we should re-factor this BSF logic into a shareable function and > > make both av_write_frame and av_interleaved_write_frame use it then, > > instead of adding it to hlsenc (and after that even more > > playlist-muxers like dash, segment, etc) > > > > > > - Said by Hendrik Leppkes > > I think Hendrik Leppkes is right, and same here > > The point is that when writing the header to a separate file (using the > segment_header_filename option), we can't rely on the underlying muxer > using auto-bsf. Since auto-bsf delays calling write_header until the first > packet of each stream is written, we'd end up with an empty header file, > with the header data being written into the first segment. > > Can this move to shareable function? because hlsenc and other list muxer maybe have same problem.
> > _______________________________________________ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org> > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel < > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel> > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel