*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Creative YUV (CYUV) Video Decoder
* by Mike Melanson (melanson@pcisys.net)
*/
/**
- * @file cyuv.c
+ * @file cyuv.c
* Creative YUV (CYUV) Video Decoder.
*/
-
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
s->avctx = avctx;
s->width = avctx->width;
+ /* width needs to be divisible by 4 for this codec to work */
+ if (s->width & 0x3)
+ return -1;
s->height = avctx->height;
avctx->pix_fmt = PIX_FMT_YUV411P;
avctx->has_b_frames = 0;
return 0;
}
-static int cyuv_decode_frame(AVCodecContext *avctx,
+static int cyuv_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
uint8_t *buf, int buf_size)
{
unsigned char cur_byte;
int pixel_groups;
- *data_size = 0;
-
/* sanity check the buffer size: A buffer has 3x16-bytes tables
* followed by (height) lines each with 3 bytes to represent groups
* of 4 pixels. Thus, the total size of the buffer ought to be:
* (3 * 16) + height * (width * 3 / 4) */
if (buf_size != 48 + s->height * (s->width * 3 / 4)) {
- printf ("ffmpeg: cyuv: got a buffer with %d bytes when %d were expected\n",
+ av_log(avctx, AV_LOG_ERROR, "ffmpeg: cyuv: got a buffer with %d bytes when %d were expected\n",
buf_size,
48 + s->height * (s->width * 3 / 4));
return -1;
if(s->frame.data[0])
avctx->release_buffer(avctx, &s->frame);
+ s->frame.buffer_hints = FF_BUFFER_HINTS_VALID;
s->frame.reference = 0;
if(avctx->get_buffer(avctx, &s->frame) < 0) {
- fprintf(stderr, "get_buffer() failed\n");
+ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return -1;
}
/* iterate through each line in the height */
for (y_ptr = 0, u_ptr = 0, v_ptr = 0;
- y_ptr < (s->height * s->frame.linesize[0]);
+ y_ptr < (s->height * s->frame.linesize[0]);
y_ptr += s->frame.linesize[0] - s->width,
u_ptr += s->frame.linesize[1] - s->width / 4,
v_ptr += s->frame.linesize[2] - s->width / 4) {
NULL,
cyuv_decode_end,
cyuv_decode_frame,
- 0,
+ CODEC_CAP_DR1,
NULL
};