[FFmpeg-devel] Fwd: [PATCH] Psygnosis YOP demuxer

Michael Niedermayer michaelni
Fri Mar 26 16:36:51 CET 2010


On Fri, Mar 26, 2010 at 05:20:29AM +0530, Mohamed Naufal wrote:
> On 24 March 2010 07:51, Michael Niedermayer <michaelni at gmx.at> wrote:
> 
> 
> [...]
> 
> > you could put a 0 or 1 in AVPacket.data[0]
> > but this is ugly, so lets just keep the ugly marking of half of them as
> > keyframes.
> >
> >
> 
> The demuxer now marks pkt.data[0] as odd/even and all pkt.flags as key-frames.
> Doing this so that seeking using
> 
> frame_pos = timestamp * frame_size + pos_min;
> seek(frame_pos);
> 
> wouldn't be wrong.
> The first 4 B of pkt.data is unused anyway.
> 
> Also modified the decoder to output in PAL8.
> 
> Naufal
[...]
> +/**
> + * Paint a macroblock using the pattern in paint_lut.
> + * @param s codec context
> + * @param tag The tag that was in the nibble.
> + */
> +static void yop_paint_block(YopDecContext *s, int tag)
> +{
> +    int offset, color_num, i;
> +
> +    for (i = 0; i < 4; i++) {
> +        offset                = s->block_offset_lut[i];
> +        color_num             = *(s->srcptr + paint_lut[tag][i]);
> +        *(s->dstptr + offset) = color_num;
> +    }

you dot need the color_num nor offset variables and it probably makes sense
to unroll this loop as its rather speed relevant and small


> +    // The number of src bytes consumed is in the last part of the lut entry.
> +    s->srcptr += paint_lut[tag][4];
> +}
> +
> +/**
> + * Copy a previously painted macroblock to the current_block.
> + * @param copy_tag The tag that was in the nibble.
> + */
> +static void yop_copy_previous_block(YopDecContext *s, int copy_tag)
> +{
> +    uint8_t *bufptr;
> +    int offset, i;
> +
> +    // Calculate position for the copy source
> +    bufptr = s->dstptr + motion_vector[copy_tag][0] +
> +             s->frame.linesize[0] * motion_vector[copy_tag][1];
> +

> +    for (i = 0; i < 4; i++) {
> +        offset                = s->block_offset_lut[i];
> +        *(s->dstptr + offset) = *(bufptr + offset);
> +    }

s->dstptr[offset] looks nicer
and this loop too probably should be unrolled


> +}
> +
> +/**
> + * Return the next nibble in sequence, consuming a new byte on the input
> + * only if necessary.
> + */
> +static uint8_t yop_get_next_nibble(YopDecContext *s)
> +{
> +    int ret;
> +
> +    if (s->low_nibble) {
> +        ret           = *s->low_nibble & 0xf;
> +        s->low_nibble = NULL;
> +    }else {
> +        s->low_nibble = s->srcptr++;
> +        ret           = *s->low_nibble >> 4;
> +    }
> +    return ret;
> +}
> +

> +/**
> + * Take s->dstptr to the next macroblock in sequence.
> + */
> +static void yop_next_macroblock(YopDecContext *s)
> +{
> +    // If we are advancing to the next row of macroblocks
> +    if (s->row_pos == s->frame.linesize[0] - 2) {
> +        s->dstptr  += s->frame.linesize[0];

this looks like it assumes width == linesize
this is not guranteed by get_buffer()


[...]
> +    palette_size = 4 + yop->num_pal_colors * 3;
[...]
> +    int palette_size           = 4 + yop->num_pal_colors * 3;

duplicate


[...]
> +static int yop_read_seek(AVFormatContext *s, int stream_index,
> +                         int64_t timestamp, int flags)
> +{
> +    YopDecContext *yop = s->priv_data;
> +    int64_t frame_pos, pos_min, pos_max;
> +
> +    av_free_packet(&yop->video_packet);
> +
> +    pos_min = s->data_offset;
> +    pos_max = url_fsize(s->pb) - yop->frame_size;
> +
> +    if(!stream_index)
> +        return -1;
> +
> +    frame_pos      = timestamp * yop->frame_size + pos_min;
> +    yop->odd_frame = timestamp & 1;
> +
> +    if (frame_pos < pos_min) {
> +        frame_pos      = pos_min;
> +        yop->odd_frame = 0;
> +    }else if (frame_pos > pos_max) {
> +        frame_pos      = pos_max;
> +        yop->odd_frame = (pos_max - pos_min) /
> +                         yop->frame_size & 1;
> +    }

cliping timestamp instead of pos would make the special case handling of
odd_frame unneeded

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I wish the Xiph folks would stop pretending they've got something they
do not.  Somehow I fear this will remain a wish. -- M?ns Rullg?rd
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100326/9a096e3b/attachment.pgp>



More information about the ffmpeg-devel mailing list