[FFmpeg-devel] [PATCH v15 16/16] fftools/ffmpeg: Use new frame-based subtitle encoding API
Soft Works
softworkz at hotmail.com
Thu Nov 25 19:52:57 EET 2021
Signed-off-by: softworkz <softworkz at hotmail.com>
---
fftools/ffmpeg.c | 60 ++++++++++++++++++++++++------------------------
1 file changed, 30 insertions(+), 30 deletions(-)
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index c697c12777..603b4c23e0 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -896,10 +896,9 @@ error:
static void do_subtitle_out(OutputFile *of, OutputStream *ost, AVFrame *frame)
{
const int subtitle_out_max_size = 1024 * 1024;
- int subtitle_out_size, nb, i;
+ int nb, i;
AVCodecContext *enc;
AVPacket *pkt = ost->pkt;
- AVSubtitle out_sub = { 0 };
int64_t pts;
if (!frame)
@@ -917,12 +916,14 @@ static void do_subtitle_out(OutputFile *of, OutputStream *ost, AVFrame *frame)
enc = ost->enc_ctx;
if (!subtitle_out) {
- subtitle_out = av_malloc(subtitle_out_max_size);
+ subtitle_out = av_mallocz(subtitle_out_max_size);
if (!subtitle_out) {
av_log(NULL, AV_LOG_FATAL, "Failed to allocate subtitle_out\n");
exit_program(1);
}
}
+ else
+ memset(subtitle_out, 0, subtitle_out_max_size);
/* Note: DVB subtitle need one packet to draw them and one other
packet to clear them */
@@ -947,44 +948,43 @@ static void do_subtitle_out(OutputFile *of, OutputStream *ost, AVFrame *frame)
frame->subtitle_end_time -= frame->subtitle_start_time;
frame->subtitle_start_time = 0;
- av_frame_get_subtitle(&out_sub, frame);
-
for (i = 0; i < nb; i++) {
- const unsigned save_num_rects = out_sub.num_rects;
+ int ret, got_packet = 0;
+ const unsigned save_num_rects = frame->num_subtitle_areas;
+
+ pkt->data = subtitle_out;
+ pkt->size = subtitle_out_max_size;
ost->frames_encoded++;
if (i == 1)
- out_sub.num_rects = 0;
+ frame->num_subtitle_areas = 0;
- subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out, subtitle_out_max_size, &out_sub);
+ ret = avcodec_encode_subtitle2(enc, pkt, frame, &got_packet);
if (i == 1)
- out_sub.num_rects = save_num_rects;
+ frame->num_subtitle_areas = save_num_rects;
- if (subtitle_out_size < 0) {
- av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
- exit_program(1);
- }
-
- //av_packet_unref(pkt);
- pkt->data = subtitle_out;
- pkt->size = subtitle_out_size;
- pkt->pts = av_rescale_q(frame->subtitle_pts, AV_TIME_BASE_Q, ost->mux_timebase);
- pkt->duration = av_rescale_q(frame->subtitle_end_time, (AVRational){ 1, 1000 }, ost->mux_timebase);
- if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
- /* XXX: the pts correction is handled here. Maybe handling
- it in the codec would be better */
- if (i == 0)
- pkt->pts += av_rescale_q(frame->subtitle_start_time, (AVRational){ 1, 1000 }, ost->mux_timebase);
- else
- pkt->pts += av_rescale_q(frame->subtitle_end_time, (AVRational){ 1, 1000 }, ost->mux_timebase);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed: %d\n", ret);
+ exit_program(ret);
+ }
+
+ if (got_packet) {
+ pkt->pts = av_rescale_q(frame->subtitle_pts, AV_TIME_BASE_Q, ost->mux_timebase);
+ pkt->duration = av_rescale_q(frame->subtitle_end_time, (AVRational){ 1, 1000 }, ost->mux_timebase);
+ if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
+ /* XXX: the pts correction is handled here. Maybe handling
+ it in the codec would be better */
+ if (i == 0)
+ pkt->pts += av_rescale_q(frame->subtitle_start_time, (AVRational){ 1, 1000 }, ost->mux_timebase);
+ else
+ pkt->pts += av_rescale_q(frame->subtitle_end_time, (AVRational){ 1, 1000 }, ost->mux_timebase);
+ }
+ pkt->dts = pkt->pts;
+ output_packet(of, pkt, ost, 0);
}
- pkt->dts = pkt->pts;
- output_packet(of, pkt, ost, 0);
}
-
- avsubtitle_free(&out_sub);
}
static void do_video_out(OutputFile *of,
--
2.30.2.windows.1
More information about the ffmpeg-devel
mailing list