* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avcodec.h"
-#include "bitstream.h"
-#include "colorspace.h"
+#include "get_bits.h"
#include "dsputil.h"
+#include "libavutil/colorspace.h"
//#define DEBUG
if (buf_size < 10)
return -1;
- sub_header->rects = NULL;
- sub_header->num_rects = 0;
- sub_header->format = 0;
- sub_header->start_display_time = 0;
- sub_header->end_display_time = 0;
+ memset(sub_header, 0, sizeof(*sub_header));
if (AV_RB16(buf) == 0) { /* HD subpicture with 4-byte offsets */
big_offsets = 1;
cmd_pos = READ_OFFSET(buf + cmd_pos);
- while ((cmd_pos + 2 + offset_size) < buf_size) {
+ while (cmd_pos > 0 && cmd_pos < buf_size - 2 - offset_size) {
date = AV_RB16(buf + cmd_pos);
next_cmd_pos = READ_OFFSET(buf + cmd_pos + 2);
-#ifdef DEBUG
- av_log(NULL, AV_LOG_INFO, "cmd_pos=0x%04x next=0x%04x date=%d\n",
- cmd_pos, next_cmd_pos, date);
-#endif
+ av_dlog(NULL, "cmd_pos=0x%04x next=0x%04x date=%d\n",
+ cmd_pos, next_cmd_pos, date);
pos = cmd_pos + 2 + offset_size;
offset1 = -1;
offset2 = -1;
x1 = y1 = x2 = y2 = 0;
while (pos < buf_size) {
cmd = buf[pos++];
-#ifdef DEBUG
- av_log(NULL, AV_LOG_INFO, "cmd=%02x\n", cmd);
-#endif
+ av_dlog(NULL, "cmd=%02x\n", cmd);
switch(cmd) {
case 0x00:
/* menu subpicture */
alpha[1] = buf[pos + 1] >> 4;
alpha[0] = buf[pos + 1] & 0x0f;
pos += 2;
-#ifdef DEBUG
- av_log(NULL, AV_LOG_INFO, "alpha=%x%x%x%x\n", alpha[0],alpha[1],alpha[2],alpha[3]);
-#endif
+ av_dlog(NULL, "alpha=%x%x%x%x\n", alpha[0],alpha[1],alpha[2],alpha[3]);
break;
case 0x05:
case 0x85:
y2 = ((buf[pos + 4] & 0x0f) << 8) | buf[pos + 5];
if (cmd & 0x80)
is_8bit = 1;
-#ifdef DEBUG
- av_log(NULL, AV_LOG_INFO, "x1=%d x2=%d y1=%d y2=%d\n",
- x1, x2, y1, y2);
-#endif
+ av_dlog(NULL, "x1=%d x2=%d y1=%d y2=%d\n", x1, x2, y1, y2);
pos += 6;
break;
case 0x06:
goto fail;
offset1 = AV_RB16(buf + pos);
offset2 = AV_RB16(buf + pos + 2);
-#ifdef DEBUG
- av_log(NULL, AV_LOG_INFO, "offset1=0x%04x offset2=0x%04x\n", offset1, offset2);
-#endif
+ av_dlog(NULL, "offset1=0x%04x offset2=0x%04x\n", offset1, offset2);
pos += 4;
break;
case 0x86:
goto fail;
offset1 = AV_RB32(buf + pos);
offset2 = AV_RB32(buf + pos + 4);
-#ifdef DEBUG
- av_log(NULL, AV_LOG_INFO, "offset1=0x%04x offset2=0x%04x\n", offset1, offset2);
-#endif
+ av_dlog(NULL, "offset1=0x%04x offset2=0x%04x\n", offset1, offset2);
pos += 8;
break;
case 0xff:
goto the_end;
default:
-#ifdef DEBUG
- av_log(NULL, AV_LOG_INFO, "unrecognised subpicture command 0x%x\n", cmd);
-#endif
+ av_dlog(NULL, "unrecognised subpicture command 0x%x\n", cmd);
goto the_end;
}
}
buf, offset1, buf_size, is_8bit);
decode_rle(bitmap + w, w * 2, w, h / 2,
buf, offset2, buf_size, is_8bit);
+ sub_header->rects[0]->pict.data[1] = av_mallocz(AVPALETTE_SIZE);
if (is_8bit) {
if (yuv_palette == 0)
goto fail;
- sub_header->rects[0]->pict.data[1] = av_malloc(256 * 4);
sub_header->rects[0]->nb_colors = 256;
yuv_a_to_rgba(yuv_palette, alpha, (uint32_t*)sub_header->rects[0]->pict.data[1], 256);
} else {
- sub_header->rects[0]->pict.data[1] = av_malloc(4 * 4);
sub_header->rects[0]->nb_colors = 4;
guess_palette((uint32_t*)sub_header->rects[0]->pict.data[1],
colormap, alpha, 0xffff00);
sub_header->rects[0]->y = y1;
sub_header->rects[0]->w = w;
sub_header->rects[0]->h = h;
+ sub_header->rects[0]->type = SUBTITLE_BITMAP;
sub_header->rects[0]->pict.linesize[0] = w;
}
}
{
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
- AVSubtitle *sub = (void *)data;
+ AVSubtitle *sub = data;
int is_menu;
is_menu = decode_dvd_subtitles(sub, buf, buf_size);
goto no_subtitle;
#if defined(DEBUG)
- av_log(NULL, AV_LOG_INFO, "start=%d ms end =%d ms\n",
- sub->start_display_time,
- sub->end_display_time);
+ av_dlog(NULL, "start=%d ms end =%d ms\n",
+ sub->start_display_time,
+ sub->end_display_time);
ppm_save("/tmp/a.ppm", sub->rects[0]->pict.data[0],
sub->rects[0]->w, sub->rects[0]->h, sub->rects[0]->pict.data[1]);
#endif
return buf_size;
}
-AVCodec dvdsub_decoder = {
+AVCodec ff_dvdsub_decoder = {
"dvdsub",
- CODEC_TYPE_SUBTITLE,
+ AVMEDIA_TYPE_SUBTITLE,
CODEC_ID_DVD_SUBTITLE,
0,
NULL,