X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fassenc.c;h=9a107aab7cd7f5153d06a28bb3e8da14401fc899;hb=a6cd817a544e4e526f18391bd2c7112dc12d2f94;hp=e59c266ee26c55ce6a76d44001f203139c4e5d20;hpb=8ae21fd95985377603c1a96e0086290fb866ab90;p=ffmpeg diff --git a/libavformat/assenc.c b/libavformat/assenc.c index e59c266ee26..9a107aab7cd 100644 --- a/libavformat/assenc.c +++ b/libavformat/assenc.c @@ -33,7 +33,6 @@ typedef struct DialogueLine { typedef struct ASSContext { const AVClass *class; - int write_ts; // 0: ssa (timing in payload), 1: ass (matroska like) int expected_readorder; DialogueLine *dialogue_cache; DialogueLine *last_added_dialogue; @@ -49,12 +48,10 @@ static int write_header(AVFormatContext *s) ASSContext *ass = s->priv_data; AVCodecContext *avctx = s->streams[0]->codec; - if (s->nb_streams != 1 || (avctx->codec_id != AV_CODEC_ID_SSA && - avctx->codec_id != AV_CODEC_ID_ASS)) { + if (s->nb_streams != 1 || avctx->codec_id != AV_CODEC_ID_ASS) { av_log(s, AV_LOG_ERROR, "Exactly one ASS/SSA stream is needed.\n"); return AVERROR(EINVAL); } - ass->write_ts = avctx->codec_id == AV_CODEC_ID_ASS; avpriv_set_pts_info(s->streams[0], 64, 1, 100); if (avctx->extradata_size > 0) { size_t header_size = avctx->extradata_size; @@ -159,50 +156,46 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) { ASSContext *ass = s->priv_data; - if (ass->write_ts) { - long int layer; - char *p = pkt->data; - int64_t start = pkt->pts; - int64_t end = start + pkt->duration; - int hh1, mm1, ss1, ms1; - int hh2, mm2, ss2, ms2; - DialogueLine *dialogue = av_mallocz(sizeof(*dialogue)); - - if (!dialogue) - return AVERROR(ENOMEM); - - dialogue->readorder = strtol(p, &p, 10); - if (dialogue->readorder < ass->expected_readorder) - av_log(s, AV_LOG_WARNING, "Unexpected ReadOrder %d\n", - dialogue->readorder); - if (*p == ',') - p++; - - if (ass->ssa_mode && !strncmp(p, "Marked=", 7)) - p += 7; - - layer = strtol(p, &p, 10); - if (*p == ',') - p++; - hh1 = (int)(start / 360000); mm1 = (int)(start / 6000) % 60; - hh2 = (int)(end / 360000); mm2 = (int)(end / 6000) % 60; - ss1 = (int)(start / 100) % 60; ms1 = (int)(start % 100); - ss2 = (int)(end / 100) % 60; ms2 = (int)(end % 100); - if (hh1 > 9) hh1 = 9, mm1 = 59, ss1 = 59, ms1 = 99; - if (hh2 > 9) hh2 = 9, mm2 = 59, ss2 = 59, ms2 = 99; - - dialogue->line = av_asprintf("%s%ld,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,%s", - ass->ssa_mode ? "Marked=" : "", - layer, hh1, mm1, ss1, ms1, hh2, mm2, ss2, ms2, p); - if (!dialogue->line) { - av_free(dialogue); - return AVERROR(ENOMEM); - } - insert_dialogue(ass, dialogue); - purge_dialogues(s, ass->ignore_readorder); - } else { - avio_write(s->pb, pkt->data, pkt->size); + long int layer; + char *p = pkt->data; + int64_t start = pkt->pts; + int64_t end = start + pkt->duration; + int hh1, mm1, ss1, ms1; + int hh2, mm2, ss2, ms2; + DialogueLine *dialogue = av_mallocz(sizeof(*dialogue)); + + if (!dialogue) + return AVERROR(ENOMEM); + + dialogue->readorder = strtol(p, &p, 10); + if (dialogue->readorder < ass->expected_readorder) + av_log(s, AV_LOG_WARNING, "Unexpected ReadOrder %d\n", + dialogue->readorder); + if (*p == ',') + p++; + + if (ass->ssa_mode && !strncmp(p, "Marked=", 7)) + p += 7; + + layer = strtol(p, &p, 10); + if (*p == ',') + p++; + hh1 = (int)(start / 360000); mm1 = (int)(start / 6000) % 60; + hh2 = (int)(end / 360000); mm2 = (int)(end / 6000) % 60; + ss1 = (int)(start / 100) % 60; ms1 = (int)(start % 100); + ss2 = (int)(end / 100) % 60; ms2 = (int)(end % 100); + if (hh1 > 9) hh1 = 9, mm1 = 59, ss1 = 59, ms1 = 99; + if (hh2 > 9) hh2 = 9, mm2 = 59, ss2 = 59, ms2 = 99; + + dialogue->line = av_asprintf("%s%ld,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,%s", + ass->ssa_mode ? "Marked=" : "", + layer, hh1, mm1, ss1, ms1, hh2, mm2, ss2, ms2, p); + if (!dialogue->line) { + av_free(dialogue); + return AVERROR(ENOMEM); } + insert_dialogue(ass, dialogue); + purge_dialogues(s, ass->ignore_readorder); return 0; } @@ -237,10 +230,10 @@ static const AVClass ass_class = { AVOutputFormat ff_ass_muxer = { .name = "ass", .long_name = NULL_IF_CONFIG_SMALL("SSA (SubStation Alpha) subtitle"), - .mime_type = "text/x-ssa", + .mime_type = "text/x-ass", .extensions = "ass,ssa", .priv_data_size = sizeof(ASSContext), - .subtitle_codec = AV_CODEC_ID_SSA, + .subtitle_codec = AV_CODEC_ID_ASS, .write_header = write_header, .write_packet = write_packet, .write_trailer = write_trailer,