summaryrefslogtreecommitdiff
path: root/libavcodec/libzvbi-teletextdec.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2013-10-25 21:12:23 +0200
committerMarton Balint <cus@passwd.hu>2013-11-10 20:00:01 +0100
commitc0479f0f062f61debadeefa17e4e9814901342a3 (patch)
tree195a78277d2a55ec9350882eb4923b0d5d53dad8 /libavcodec/libzvbi-teletextdec.c
parent4947b0624b4f6f56fb8d9da1568441329e9650a1 (diff)
libzvbi-teletextdec: propagate errors generated in page handler
Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavcodec/libzvbi-teletextdec.c')
-rw-r--r--libavcodec/libzvbi-teletextdec.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/libavcodec/libzvbi-teletextdec.c b/libavcodec/libzvbi-teletextdec.c
index 9a0deba0f3..bf2dc063ab 100644
--- a/libavcodec/libzvbi-teletextdec.c
+++ b/libavcodec/libzvbi-teletextdec.c
@@ -60,6 +60,7 @@ typedef struct TeletextContext
TeletextPage *pages;
int nb_pages;
int64_t pts;
+ int handler_ret;
vbi_decoder * vbi;
vbi_dvb_demux * dx;
@@ -307,6 +308,8 @@ handler(vbi_event *ev, void *user_data)
if (strcmp(ctx->pgno, "*") && !strstr(ctx->pgno, pgno_str))
return;
+ if (ctx->handler_ret < 0)
+ return;
/* Fetch the page. */
res = vbi_fetch_vt_page(ctx->vbi, &page,
@@ -345,17 +348,22 @@ handler(vbi_event *ev, void *user_data)
res = (ctx->format_id == 0) ?
gen_sub_bitmap(ctx, cur_page->sub_rect, &page, chop_top) :
gen_sub_text (ctx, cur_page->sub_rect, &page, chop_top);
- if (res)
+ if (res < 0) {
av_freep(&cur_page->sub_rect);
- else
+ ctx->handler_ret = res;
+ } else {
ctx->pages[ctx->nb_pages++] = *cur_page;
+ }
+ } else {
+ ctx->handler_ret = AVERROR(ENOMEM);
}
} else {
- av_log(ctx, AV_LOG_ERROR, "Failed to allocate memory to to buffer pages\n");
+ ctx->handler_ret = AVERROR(ENOMEM);
}
} else {
//TODO: If multiple packets contain more than one page, pages may got queued up, and this may happen...
av_log(ctx, AV_LOG_ERROR, "Buffered too many pages, dropping page %s.\n", pgno_str);
+ ctx->handler_ret = AVERROR(ENOSYS);
}
vbi_unref_page(&page);
@@ -403,6 +411,8 @@ teletext_decode_frame(AVCodecContext *avctx,
* (see mpegts demuxer) are not accurate enough to pass that test. */
vbi_dvb_demux_cor(ctx->dx, ctx->sliced, 64, NULL, &pesheader_buf, &pesheader_size);
+ ctx->handler_ret = pkt->size;
+
while (left > 0) {
int64_t pts = 0;
unsigned int lines = vbi_dvb_demux_cor(ctx->dx, ctx->sliced, 64, &pts, &buf, &left);
@@ -423,9 +433,12 @@ teletext_decode_frame(AVCodecContext *avctx,
}
}
ctx->pts = AV_NOPTS_VALUE;
- ret = pkt->size;
+ ret = ctx->handler_ret;
}
+ if (ret < 0)
+ return ret;
+
// is there a subtitle to pass?
if (ctx->nb_pages) {
int i;