diff options
author | Marton Balint <cus@passwd.hu> | 2013-11-24 15:09:52 +0100 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2013-11-25 19:51:27 +0100 |
commit | a02860351db5e06ff960a77e542b076dde7f6797 (patch) | |
tree | 69480bcb3b6330fd9183ed1c087f10f48754352c /ffprobe.c | |
parent | c0f2e0713566a2bf1c9dc9fd8b60ea30a9ebc418 (diff) | |
download | ffmpeg-a02860351db5e06ff960a77e542b076dde7f6797.tar.gz |
ffprobe: add support for subtitle frames
Signed-off-by: Marton Balint <cus@passwd.hu>
Signed-off-by: Stefano Sabatini <stefasab@gmail.com>
Diffstat (limited to 'ffprobe.c')
-rw-r--r-- | ffprobe.c | 40 |
1 files changed, 38 insertions, 2 deletions
@@ -135,6 +135,7 @@ typedef enum { SECTION_ID_STREAM_DISPOSITION, SECTION_ID_STREAMS, SECTION_ID_STREAM_TAGS, + SECTION_ID_SUBTITLE, } SectionID; static struct section sections[] = { @@ -144,7 +145,7 @@ static struct section sections[] = { [SECTION_ID_ERROR] = { SECTION_ID_ERROR, "error", 0, { -1 } }, [SECTION_ID_FORMAT] = { SECTION_ID_FORMAT, "format", 0, { SECTION_ID_FORMAT_TAGS, -1 } }, [SECTION_ID_FORMAT_TAGS] = { SECTION_ID_FORMAT_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "format_tags" }, - [SECTION_ID_FRAMES] = { SECTION_ID_FRAMES, "frames", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME, -1 } }, + [SECTION_ID_FRAMES] = { SECTION_ID_FRAMES, "frames", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME, SECTION_ID_SUBTITLE, -1 } }, [SECTION_ID_FRAME] = { SECTION_ID_FRAME, "frame", 0, { SECTION_ID_FRAME_TAGS, -1 } }, [SECTION_ID_FRAME_TAGS] = { SECTION_ID_FRAME_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "frame_tags" }, [SECTION_ID_LIBRARY_VERSIONS] = { SECTION_ID_LIBRARY_VERSIONS, "library_versions", SECTION_FLAG_IS_ARRAY, { SECTION_ID_LIBRARY_VERSION, -1 } }, @@ -167,6 +168,7 @@ static struct section sections[] = { [SECTION_ID_STREAM] = { SECTION_ID_STREAM, "stream", 0, { SECTION_ID_STREAM_DISPOSITION, SECTION_ID_STREAM_TAGS, -1 } }, [SECTION_ID_STREAM_DISPOSITION] = { SECTION_ID_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "stream_disposition" }, [SECTION_ID_STREAM_TAGS] = { SECTION_ID_STREAM_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "stream_tags" }, + [SECTION_ID_SUBTITLE] = { SECTION_ID_SUBTITLE, "subtitle", 0, { -1 } }, }; static const OptionDef *options; @@ -1675,6 +1677,29 @@ static void show_packet(WriterContext *w, AVFormatContext *fmt_ctx, AVPacket *pk fflush(stdout); } +static void show_subtitle(WriterContext *w, AVSubtitle *sub, AVStream *stream, + AVFormatContext *fmt_ctx) +{ + AVBPrint pbuf; + + av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED); + + writer_print_section_header(w, SECTION_ID_SUBTITLE); + + print_str ("media_type", "subtitle"); + print_ts ("pts", sub->pts); + print_time("pts_time", sub->pts, &AV_TIME_BASE_Q); + print_int ("format", sub->format); + print_int ("start_display_time", sub->start_display_time); + print_int ("end_display_time", sub->end_display_time); + print_int ("num_rects", sub->num_rects); + + writer_print_section_footer(w); + + av_bprint_finalize(&pbuf, NULL); + fflush(stdout); +} + static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream, AVFormatContext *fmt_ctx) { @@ -1751,6 +1776,7 @@ static av_always_inline int process_frame(WriterContext *w, AVFrame *frame, AVPacket *pkt) { AVCodecContext *dec_ctx = fmt_ctx->streams[pkt->stream_index]->codec; + AVSubtitle sub; int ret = 0, got_frame = 0; avcodec_get_frame_defaults(frame); @@ -1763,6 +1789,10 @@ static av_always_inline int process_frame(WriterContext *w, case AVMEDIA_TYPE_AUDIO: ret = avcodec_decode_audio4(dec_ctx, frame, &got_frame, pkt); break; + + case AVMEDIA_TYPE_SUBTITLE: + ret = avcodec_decode_subtitle2(dec_ctx, &sub, &got_frame, pkt); + break; } } @@ -1772,9 +1802,15 @@ static av_always_inline int process_frame(WriterContext *w, pkt->data += ret; pkt->size -= ret; if (got_frame) { + int is_sub = (dec_ctx->codec_type == AVMEDIA_TYPE_SUBTITLE); nb_streams_frames[pkt->stream_index]++; if (do_show_frames) - show_frame(w, frame, fmt_ctx->streams[pkt->stream_index], fmt_ctx); + if (is_sub) + show_subtitle(w, &sub, fmt_ctx->streams[pkt->stream_index], fmt_ctx); + else + show_frame(w, frame, fmt_ctx->streams[pkt->stream_index], fmt_ctx); + if (is_sub) + avsubtitle_free(&sub); } return got_frame; } |