[FFmpeg-devel] [PATCH] Add DPX decoder

Michael Niedermayer michaelni
Wed May 6 15:44:51 CEST 2009


On Wed, May 06, 2009 at 02:35:30PM +0100, Jimmy Christensen wrote:
> 
> 
> Best Regards 
> Jimmy Christensen 
> Developer 
> Ghost A/S 
> 
> ----- "Michael Niedermayer" <michaelni at gmx.at> wrote:
> 
> | On Wed, May 06, 2009 at 01:56:56PM +0100, Jimmy Christensen wrote:
> | [...]
> | > | 
> | > | [...]
> | > | > +	if(endian == 0x0) {
> | > | > +		offset = AV_RB32(headerBuffer); headerBuffer += 4;
> | > | > +		bytestream_get_buffer(&headerBuffer, version, 8);
> | headerBuffer +=
> | > | 8;
> | > | > +		// Jump in extra 744 bytes to end in address 744 + 4 + 4 + 8
> | =
> | > | 760 = 0x2f8
> | > | > +		headerBuffer += 744;
> | > | > +		orientation = AV_RB32(headerBuffer); headerBuffer += 4;
> | > | > +		w = AV_RB32(headerBuffer); headerBuffer += 4;
> | > | > +		h = AV_RB32(headerBuffer); headerBuffer += 4;
> | > | > +	} else {
> | > | > +		offset = AV_RL32(headerBuffer); headerBuffer += 4;
> | > | > +		bytestream_get_buffer(&headerBuffer, version, 8);
> | headerBuffer +=
> | > | 8;
> | > | > +		// Jump in extra 744 bytes to end in address 744 + 4 + 4 + 8
> | =
> | > | 760 = 0x2f8
> | > | > +		headerBuffer += 744;
> | > | > +		orientation = AV_RL32(headerBuffer); headerBuffer += 4;
> | > | > +		w = AV_RL32(headerBuffer); headerBuffer += 4;
> | > | > +		h = AV_RL32(headerBuffer); headerBuffer += 4;
> | > | > +	}
> | > | 
> | > | code duplication
> | > | 
> | > 
> | > No, one is for big endian numbers, the other is for little endian.
> | There are 2 types of DPX files.
> | 
> | you duplicate a flexible endian 32bit reading function
> | 
> 
> How does it work then?

static unsigned int read32(ptr, is_big)
{
    return is_big ? AV_RB32 : AV_RL32
}


> 
> Sorry, I'm very new to ffmpeg and it's my first patch.
> 
> | 
> | > 
> | > | 
> | > | > +
> | > | > +	s->width = w;
> | > | > +	s->height = h;
> | > | > +	s->bpp = 32;
> | > | > +	avctx->pix_fmt = PIX_FMT_RGB32;
> | > | > +
> | > | > +	if(s->picture.data[0])
> | > | > +		avctx->release_buffer(avctx, &s->picture);
> | > | > +	if(avcodec_check_dimensions(avctx, w, h))
> | > | > +		return -1;
> | > | > +	if(w != avctx->width || h != avctx->height)
> | > | > +		avcodec_set_dimensions(avctx, w, h);
> | > | > +	if(avctx->get_buffer(avctx, p) < 0) {
> | > | > +		av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
> | > | > +		return -1;
> | > | > +	}
> | > | > +
> | > | > +	buf += offset;
> | > | > +
> | > | > +	ptr = p->data[0];
> | > | > +	stride = p->linesize[0];
> | > | > +
> | > | > +	for(x = 0; x < s->height; x++) {
> | > | > +		uint8_t *dst = ptr;
> | > | > +		for(y = 0; y < s->width; y++) {
> | > | > +			rgbBuffer = AV_RB32(buf);
> | > | > +			memcpy(&rgbField, &rgbBuffer, 4);
> | > | > +			dst[0] = ((rgbField.R * 256) / 1024);
> | > | > +			dst[1] = ((rgbField.G * 256) / 1024);
> | > | > +			dst[2] = ((rgbField.B * 256) / 1024);
> | > | 
> | > | discarding 2 bits in the decoder is unacceptable
> | > | also this way of reading is not portable
> | > | 
> | > 
> | > How so? The last 2 bits are not used, since it's too small for alpha
> | channel.
> | 
> | ((rgbField.R * 256) / 1024);
> | discards 2 bits
> | 
> 
> You mean converts from 10bit to 8bit? Yes. But didn't know ffmpeg supported 10bit. Any suggestion on how to get the buffer 10bit is much appreciated.

using PIX_FMT_RGB48 would be an option

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Frequently ignored awnser#1 FFmpeg bugs should be sent to our bugtracker. User
questions about the command line tools should be sent to the ffmpeg-user ML.
And questions about how to use libav* should be sent to the libav-user ML.
-------------- 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/20090506/e5f994f2/attachment.pgp>



More information about the ffmpeg-devel mailing list