[FFmpeg-devel] [PATCH 1/2] allow passing subtitles header between decoder and encoder

Aurelien Jacobs aurel
Tue Oct 19 21:55:47 CEST 2010


On Tue, Oct 19, 2010 at 03:43:52PM +0200, Michael Niedermayer wrote:
> On Sat, Oct 16, 2010 at 05:31:26PM +0200, Aurelien Jacobs wrote:
> > ---
> >  ffmpeg.c             |   11 +++++++++++
> >  libavcodec/avcodec.h |    8 ++++++++
> >  libavcodec/utils.c   |    2 ++
> >  libavformat/utils.c  |    4 ++++
> >  4 files changed, 25 insertions(+), 0 deletions(-)
> > 
> > diff --git a/ffmpeg.c b/ffmpeg.c
> > index 4f59b2e..7622ccc 100644
> > --- a/ffmpeg.c
> > +++ b/ffmpeg.c
> > @@ -2365,6 +2365,7 @@ static int transcode(AVFormatContext **output_files,
> >          ost = ost_table[i];
> >          if (ost->encoding_needed) {
> >              AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
> > +            AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
> >              if (!codec)
> >                  codec = avcodec_find_encoder(ost->st->codec->codec_id);
> >              if (!codec) {
> > @@ -2373,6 +2374,15 @@ static int transcode(AVFormatContext **output_files,
> >                  ret = AVERROR(EINVAL);
> >                  goto dump_format;
> >              }
> > +            if (dec->subtitle_header) {
> > +                ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
> > +                if (!ost->st->codec->subtitle_header) {
> > +                    ret = AVERROR(ENOMEM);
> > +                    goto dump_format;
> > +                }
> > +                memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
> > +                ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
> > +            }
> >              if (avcodec_open(ost->st->codec, codec) < 0) {
> >                  snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
> >                          ost->file_index, ost->index);
> > @@ -2728,6 +2738,7 @@ static int transcode(AVFormatContext **output_files,
> >                  }
> >                  av_fifo_free(ost->fifo); /* works even if fifo is not
> >                                               initialized but set to zero */
> > +                av_freep(&ost->st->codec->subtitle_header);
> >                  av_free(ost->pict_tmp.data[0]);
> >                  if (ost->video_resample)
> >                      sws_freeContext(ost->img_resample_ctx);
> > diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> > index 4bddbaa..ab3cbd9 100644
> > --- a/libavcodec/avcodec.h
> > +++ b/libavcodec/avcodec.h
> > @@ -2744,6 +2744,14 @@ typedef struct AVCodecContext {
> >       * - decoding: unused
> >       */
> >      int lpc_passes;
> > +
> > +    /**
> > +     * Header containing style information for text subtitles.
> > +     * - encoding: Set/allocated/freed by user (before avcodec_open())
> > +     * - decoding: Set/allocated/freed by libavcodec (by avcodec_open())
> > +     */
> > +    uint8_t *subtitle_header;
> > +    int subtitle_header_size;
> >  } AVCodecContext;
> >  
> >  /**
> 
> The description should be enough to implement a decoder and a user app and
> a subtitle renderer based on it. (some common sense and guessing not excluded)
> but this seems too terse for that

OK. Updated patch.
I think it should now be enough to implement anything related to this
field, with a little bit of common sense and the ASS spec around.

> also are you sure every subtitle decoder will be able to set this by
> avcodec_open() ?

Yes, sure. It wouldn't be very useful anyway to set it later on.
I've already (started to) implement several decoders (SubRip,
MicroDVD, Movtext...), and they fits well within this model.

Aurel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: subtitle_header.diff
Type: text/x-diff
Size: 4148 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20101019/abbf35a2/attachment.diff>



More information about the ffmpeg-devel mailing list