Call this new function before decode() to replace the custom and inconsistant initialization in various decoders. This function is equivalent to avcodec_get_frame_defaults() for AVFrame. Signed-off-by: Aurelien Jacobs <aurel@gnuage.org>tags/n0.8
| @@ -62,11 +62,6 @@ int ff_ass_subtitle_header_default(AVCodecContext *avctx) | |||||
| ASS_DEFAULT_ALIGNMENT); | ASS_DEFAULT_ALIGNMENT); | ||||
| } | } | ||||
| void ff_ass_init(AVSubtitle *sub) | |||||
| { | |||||
| memset(sub, 0, sizeof(*sub)); | |||||
| } | |||||
| static int ts_to_string(char *str, int strlen, int ts) | static int ts_to_string(char *str, int strlen, int ts) | ||||
| { | { | ||||
| int h, m, s; | int h, m, s; | ||||
| @@ -69,13 +69,6 @@ int ff_ass_subtitle_header(AVCodecContext *avctx, | |||||
| */ | */ | ||||
| int ff_ass_subtitle_header_default(AVCodecContext *avctx); | int ff_ass_subtitle_header_default(AVCodecContext *avctx); | ||||
| /** | |||||
| * Initialize an AVSubtitle structure for use with ff_ass_add_rect(). | |||||
| * | |||||
| * @param sub pointer to the AVSubtitle | |||||
| */ | |||||
| void ff_ass_init(AVSubtitle *sub); | |||||
| /** | /** | ||||
| * Add an ASS dialog line to an AVSubtitle as a new AVSubtitleRect. | * Add an ASS dialog line to an AVSubtitle as a new AVSubtitleRect. | ||||
| * | * | ||||
| @@ -38,8 +38,6 @@ static int ass_decode_frame(AVCodecContext *avctx, void *data, int *got_sub_ptr, | |||||
| const char *ptr = avpkt->data; | const char *ptr = avpkt->data; | ||||
| int len, size = avpkt->size; | int len, size = avpkt->size; | ||||
| ff_ass_init(data); | |||||
| while (size > 0) { | while (size > 0) { | ||||
| len = ff_ass_add_rect(data, ptr, 0, 0/* FIXME: duration */, 1); | len = ff_ass_add_rect(data, ptr, 0, 0/* FIXME: duration */, 1); | ||||
| if (len < 0) | if (len < 0) | ||||
| @@ -1323,10 +1323,7 @@ static int dvbsub_display_end_segment(AVCodecContext *avctx, const uint8_t *buf, | |||||
| int i; | int i; | ||||
| int offset_x=0, offset_y=0; | int offset_x=0, offset_y=0; | ||||
| sub->rects = NULL; | |||||
| sub->start_display_time = 0; | |||||
| sub->end_display_time = ctx->time_out * 1000; | sub->end_display_time = ctx->time_out * 1000; | ||||
| sub->format = 0; | |||||
| if (display_def) { | if (display_def) { | ||||
| offset_x = display_def->x; | offset_x = display_def->x; | ||||
| @@ -173,7 +173,6 @@ static int decode_dvd_subtitles(AVSubtitle *sub_header, | |||||
| if (buf_size < 10) | if (buf_size < 10) | ||||
| return -1; | return -1; | ||||
| memset(sub_header, 0, sizeof(*sub_header)); | |||||
| if (AV_RB16(buf) == 0) { /* HD subpicture with 4-byte offsets */ | if (AV_RB16(buf) == 0) { /* HD subpicture with 4-byte offsets */ | ||||
| big_offsets = 1; | big_offsets = 1; | ||||
| @@ -357,7 +357,6 @@ static int display_end_segment(AVCodecContext *avctx, void *data, | |||||
| * not been cleared by a subsequent empty display command. | * not been cleared by a subsequent empty display command. | ||||
| */ | */ | ||||
| memset(sub, 0, sizeof(*sub)); | |||||
| // Blank if last object_number was 0. | // Blank if last object_number was 0. | ||||
| // Note that this may be wrong for more complex subtitles. | // Note that this may be wrong for more complex subtitles. | ||||
| if (!ctx->presentation.object_number) | if (!ctx->presentation.object_number) | ||||
| @@ -216,8 +216,6 @@ static int srt_decode_frame(AVCodecContext *avctx, | |||||
| if (avpkt->size <= 0) | if (avpkt->size <= 0) | ||||
| return avpkt->size; | return avpkt->size; | ||||
| ff_ass_init(sub); | |||||
| while (ptr < end && *ptr) { | while (ptr < end && *ptr) { | ||||
| ptr = read_ts(ptr, &ts_start, &ts_end, &x1, &y1, &x2, &y2); | ptr = read_ts(ptr, &ts_start, &ts_end, &x1, &y1, &x2, &y2); | ||||
| if (!ptr) | if (!ptr) | ||||
| @@ -474,6 +474,12 @@ AVFrame *avcodec_alloc_frame(void){ | |||||
| return pic; | return pic; | ||||
| } | } | ||||
| static void avcodec_get_subtitle_defaults(AVSubtitle *sub) | |||||
| { | |||||
| memset(sub, 0, sizeof(*sub)); | |||||
| sub->pts = AV_NOPTS_VALUE; | |||||
| } | |||||
| int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | ||||
| { | { | ||||
| int ret= -1; | int ret= -1; | ||||
| @@ -795,6 +801,7 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, | |||||
| avctx->pkt = avpkt; | avctx->pkt = avpkt; | ||||
| *got_sub_ptr = 0; | *got_sub_ptr = 0; | ||||
| avcodec_get_subtitle_defaults(sub); | |||||
| ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt); | ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt); | ||||
| if (*got_sub_ptr) | if (*got_sub_ptr) | ||||
| avctx->frame_number++; | avctx->frame_number++; | ||||
| @@ -55,8 +55,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||||
| int64_t packet_time = 0; | int64_t packet_time = 0; | ||||
| GetBitContext gb; | GetBitContext gb; | ||||
| memset(sub, 0, sizeof(*sub)); | |||||
| // check that at least header fits | // check that at least header fits | ||||
| if (buf_size < 27 + 7 * 2 + 4 * 3) { | if (buf_size < 27 + 7 * 2 + 4 * 3) { | ||||
| av_log(avctx, AV_LOG_ERROR, "coded frame too small\n"); | av_log(avctx, AV_LOG_ERROR, "coded frame too small\n"); | ||||