-AVCodec dvdsub_decoder = {
- "dvdsub",
- CODEC_TYPE_SUBTITLE,
- CODEC_ID_DVD_SUBTITLE,
- 0,
- dvdsub_init_decoder,
- NULL,
- dvdsub_close_decoder,
- dvdsub_decode,
-};
-
-/* parser definition */
-typedef struct DVDSubParseContext {
- uint8_t *packet;
- int packet_len;
- int packet_index;
-} DVDSubParseContext;
-
-static int dvdsub_parse_init(AVCodecParserContext *s)
-{
- return 0;
-}
-
-static int dvdsub_parse(AVCodecParserContext *s,
- AVCodecContext *avctx,
- uint8_t **poutbuf, int *poutbuf_size,
- const uint8_t *buf, int buf_size)
-{
- DVDSubParseContext *pc = s->priv_data;
-
- if (pc->packet_index == 0) {
- if (buf_size < 2)
- return 0;
- pc->packet_len = (buf[0] << 8) | buf[1];
- av_freep(&pc->packet);
- pc->packet = av_malloc(pc->packet_len);
- }
- if (pc->packet) {
- if (pc->packet_index + buf_size <= pc->packet_len) {
- memcpy(pc->packet + pc->packet_index, buf, buf_size);
- pc->packet_index += buf_size;
- if (pc->packet_index >= pc->packet_len) {
- *poutbuf = pc->packet;
- *poutbuf_size = pc->packet_len;
- pc->packet_index = 0;
- return buf_size;
- }
- } else {
- /* erroneous size */
- pc->packet_index = 0;
- }
- }
- *poutbuf = NULL;
- *poutbuf_size = 0;
- return buf_size;
-}
-
-static void dvdsub_parse_close(AVCodecParserContext *s)
-{
- DVDSubParseContext *pc = s->priv_data;
- av_freep(&pc->packet);
-}
-
-AVCodecParser dvdsub_parser = {
- { CODEC_ID_DVD_SUBTITLE },
- sizeof(DVDSubParseContext),
- dvdsub_parse_init,
- dvdsub_parse,
- dvdsub_parse_close,
+AVCodec ff_dvdsub_decoder = {
+ .name = "dvdsub",
+ .type = AVMEDIA_TYPE_SUBTITLE,
+ .id = CODEC_ID_DVD_SUBTITLE,
+ .decode = dvdsub_decode,
+ .long_name = NULL_IF_CONFIG_SMALL("DVD subtitles"),