[FFmpeg-devel] [PATCH 14/37] avformat/matroskadec: Remove non-incremental parsing of clusters

James Almer jamrial at gmail.com
Sun Jun 23 06:04:22 EEST 2019


On 5/16/2019 7:29 PM, Andreas Rheinhardt wrote:
> When the new incremental parser was introduced, the old parser was
> kept, because the new parser was unable to handle the way SSA packets
> are put into Matroska. But since 2014 (since c7d8dbad) this is no
> longer needed, so that the old parser can be completely removed.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
>  libavformat/matroskadec.c | 72 ++++++---------------------------------
>  1 file changed, 10 insertions(+), 62 deletions(-)
> 
> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> index e01f1703e7..c0767c3529 100644
> --- a/libavformat/matroskadec.c
> +++ b/libavformat/matroskadec.c
> @@ -362,9 +362,6 @@ typedef struct MatroskaDemuxContext {
>      int64_t current_cluster_pos;
>      MatroskaCluster current_cluster;
>  
> -    /* File has SSA subtitles which prevent incremental cluster parsing. */
> -    int contains_ssa;
> -
>      /* WebM DASH Manifest live flag */
>      int is_live;
>  
> @@ -709,25 +706,7 @@ static const EbmlSyntax matroska_blockgroup[] = {
>      { 0 }
>  };
>  
> -static const EbmlSyntax matroska_cluster[] = {
> -    { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0,                     offsetof(MatroskaCluster, timecode) },
> -    { MATROSKA_ID_BLOCKGROUP,      EBML_NEST, sizeof(MatroskaBlock), offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
> -    { MATROSKA_ID_SIMPLEBLOCK,     EBML_PASS, sizeof(MatroskaBlock), offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
> -    { MATROSKA_ID_CLUSTERPOSITION, EBML_NONE },
> -    { MATROSKA_ID_CLUSTERPREVSIZE, EBML_NONE },
> -    { 0 }
> -};
> -
> -static const EbmlSyntax matroska_clusters[] = {
> -    { MATROSKA_ID_CLUSTER,  EBML_NEST, 0, 0, { .n = matroska_cluster } },
> -    { MATROSKA_ID_INFO,     EBML_NONE },
> -    { MATROSKA_ID_CUES,     EBML_NONE },
> -    { MATROSKA_ID_TAGS,     EBML_NONE },
> -    { MATROSKA_ID_SEEKHEAD, EBML_NONE },
> -    { 0 }
> -};
> -
> -static const EbmlSyntax matroska_cluster_incremental_parsing[] = {
> +static const EbmlSyntax matroska_cluster_parsing[] = {
>      { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0,                     offsetof(MatroskaCluster, timecode) },
>      { MATROSKA_ID_BLOCKGROUP,      EBML_NEST, sizeof(MatroskaBlock), offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
>      { MATROSKA_ID_SIMPLEBLOCK,     EBML_PASS, sizeof(MatroskaBlock), offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
> @@ -741,7 +720,7 @@ static const EbmlSyntax matroska_cluster_incremental_parsing[] = {
>      { 0 }
>  };
>  
> -static const EbmlSyntax matroska_cluster_incremental[] = {
> +static const EbmlSyntax matroska_cluster[] = {
>      { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0, offsetof(MatroskaCluster, timecode) },
>      { MATROSKA_ID_BLOCKGROUP,      EBML_STOP },
>      { MATROSKA_ID_SIMPLEBLOCK,     EBML_STOP },
> @@ -750,8 +729,8 @@ static const EbmlSyntax matroska_cluster_incremental[] = {
>      { 0 }
>  };
>  
> -static const EbmlSyntax matroska_clusters_incremental[] = {
> -    { MATROSKA_ID_CLUSTER,  EBML_NEST, 0, 0, { .n = matroska_cluster_incremental } },
> +static const EbmlSyntax matroska_clusters[] = {
> +    { MATROSKA_ID_CLUSTER,  EBML_NEST, 0, 0, { .n = matroska_cluster } },
>      { MATROSKA_ID_INFO,     EBML_NONE },
>      { MATROSKA_ID_CUES,     EBML_NONE },
>      { MATROSKA_ID_TAGS,     EBML_NONE },
> @@ -2648,8 +2627,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
>              }
>          } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
>              st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
> -            if (st->codecpar->codec_id == AV_CODEC_ID_ASS)
> -                matroska->contains_ssa = 1;
>          }
>      }
>  
> @@ -3520,19 +3497,19 @@ end:
>      return res;
>  }
>  
> -static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
> +static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
>  {
>      EbmlList *blocks_list;
>      MatroskaBlock *blocks;
>      int i, res;
>      res = ebml_parse(matroska,
> -                     matroska_cluster_incremental_parsing,
> +                     matroska_cluster_parsing,
>                       &matroska->current_cluster);
>      if (res == 1) {
>          /* New Cluster */
>          if (matroska->current_cluster_pos)
>              ebml_level_end(matroska);
> -        ebml_free(matroska_cluster, &matroska->current_cluster);
> +        ebml_free(matroska_cluster_parsing, &matroska->current_cluster);
>          memset(&matroska->current_cluster, 0, sizeof(MatroskaCluster));
>          matroska->current_cluster_num_blocks = 0;
>          matroska->current_cluster_pos        = avio_tell(matroska->ctx->pb);
> @@ -3540,12 +3517,12 @@ static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
>          if (matroska->current_id)
>              matroska->current_cluster_pos -= 4;
>          res = ebml_parse(matroska,
> -                         matroska_clusters_incremental,
> +                         matroska_clusters,
>                           &matroska->current_cluster);
>          /* Try parsing the block again. */
>          if (res == 1)
>              res = ebml_parse(matroska,
> -                             matroska_cluster_incremental_parsing,
> +                             matroska_cluster_parsing,
>                               &matroska->current_cluster);
>      }
>  
> @@ -3576,35 +3553,6 @@ static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
>      return res;
>  }
>  
> -static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
> -{
> -    MatroskaCluster cluster = { 0 };
> -    EbmlList *blocks_list;
> -    MatroskaBlock *blocks;
> -    int i, res;
> -    int64_t pos;
> -
> -    if (!matroska->contains_ssa)
> -        return matroska_parse_cluster_incremental(matroska);
> -    pos = avio_tell(matroska->ctx->pb);
> -    if (matroska->current_id)
> -        pos -= 4;  /* sizeof the ID which was already read */
> -    res         = ebml_parse(matroska, matroska_clusters, &cluster);
> -    blocks_list = &cluster.blocks;
> -    blocks      = blocks_list->elem;
> -    for (i = 0; i < blocks_list->nb_elem; i++)
> -        if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
> -            int is_keyframe = blocks[i].non_simple ? blocks[i].reference == INT64_MIN : -1;
> -            res = matroska_parse_block(matroska, blocks[i].bin.buf, blocks[i].bin.data,
> -                                       blocks[i].bin.size, blocks[i].bin.pos,
> -                                       cluster.timecode, blocks[i].duration,
> -                                       is_keyframe, NULL, 0, 0, pos,
> -                                       blocks[i].discard_padding);
> -        }
> -    ebml_free(matroska_cluster, &cluster);
> -    return res;
> -}
> -
>  static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
>  {
>      MatroskaDemuxContext *matroska = s->priv_data;
> @@ -3699,7 +3647,7 @@ static int matroska_read_close(AVFormatContext *s)
>      for (n = 0; n < matroska->tracks.nb_elem; n++)
>          if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)
>              av_freep(&tracks[n].audio.buf);
> -    ebml_free(matroska_cluster, &matroska->current_cluster);
> +    ebml_free(matroska_cluster_parsing, &matroska->current_cluster);
>      ebml_free(matroska_segment, matroska);
>  
>      return 0;

Applied.


More information about the ffmpeg-devel mailing list