OSDN Git Service

Set buffer hints, use cr where available
authorRoberto Togni <r_togni@tiscali.it>
Fri, 7 Nov 2003 21:21:36 +0000 (21:21 +0000)
committerRoberto Togni <r_togni@tiscali.it>
Fri, 7 Nov 2003 21:21:36 +0000 (21:21 +0000)
Originally committed as revision 2485 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/msrle.c
libavcodec/msvideo1.c
libavcodec/rpza.c

index ce5c4c0..5422d9b 100644 (file)
@@ -160,10 +160,19 @@ static int msrle_decode_frame(AVCodecContext *avctx,
 {
     MsrleContext *s = (MsrleContext *)avctx->priv_data;
 
+       /* no supplementary picture */
+       if (buf_size == 0)
+               return 0;
+
     s->buf = buf;
     s->size = buf_size;
 
     s->frame.reference = 1;
+    s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE;
+    if (avctx->cr_available)
+        s->frame.buffer_hints |= FF_BUFFER_HINTS_REUSABLE;
+    else
+        s->frame.buffer_hints |= FF_BUFFER_HINTS_READABLE;
     if (avctx->get_buffer(avctx, &s->frame)) {
         av_log(avctx, AV_LOG_ERROR, "  MS RLE: get_buffer() failed\n");
         return -1;
@@ -185,6 +194,7 @@ static int msrle_decode_frame(AVCodecContext *avctx,
         avctx->release_buffer(avctx, &s->prev_frame);
 
     /* shuffle frames */
+  if (!avctx->cr_available)
     s->prev_frame = s->frame;
 
     *data_size = sizeof(AVFrame);
@@ -214,5 +224,5 @@ AVCodec msrle_decoder = {
     NULL,
     msrle_decode_end,
     msrle_decode_frame,
-    CODEC_CAP_DR1,
+    CODEC_CAP_DR1 | CODEC_CAP_CR,
 };
index 207d4ef..d08792e 100644 (file)
   }
 
 #define COPY_PREV_BLOCK() \
+  if (!s->avctx->cr_available) {\
     pixel_ptr = block_ptr; \
     for (pixel_y = 0; pixel_y < 4; pixel_y++) { \
         for (pixel_x = 0; pixel_x < 4; pixel_x++, pixel_ptr++) \
             pixels[pixel_ptr] = prev_pixels[pixel_ptr]; \
         pixel_ptr -= row_dec; \
-    }
+    } \
+  }
 
 typedef struct Msvideo1Context {
 
@@ -318,9 +320,19 @@ static int msvideo1_decode_frame(AVCodecContext *avctx,
 {
     Msvideo1Context *s = (Msvideo1Context *)avctx->priv_data;
 
+       /* no supplementary picture */
+       if (buf_size == 0)
+               return 0;
+
     s->buf = buf;
     s->size = buf_size;
 
+       s->frame.reference = 1;
+       s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE;
+    if (avctx->cr_available)
+        s->frame.buffer_hints |= FF_BUFFER_HINTS_REUSABLE;
+    else
+        s->frame.buffer_hints |= FF_BUFFER_HINTS_READABLE;
     if (avctx->get_buffer(avctx, &s->frame)) {
         av_log(s->avctx, AV_LOG_ERROR, "  MS Video-1 Video: get_buffer() failed\n");
         return -1;
@@ -340,6 +352,7 @@ static int msvideo1_decode_frame(AVCodecContext *avctx,
         avctx->release_buffer(avctx, &s->prev_frame);
 
     /* shuffle frames */
+  if (!avctx->cr_available)
     s->prev_frame = s->frame;
 
     *data_size = sizeof(AVFrame);
@@ -368,5 +381,5 @@ AVCodec msvideo1_decoder = {
     NULL,
     msvideo1_decode_end,
     msvideo1_decode_frame,
-    CODEC_CAP_DR1,
+    CODEC_CAP_DR1 | CODEC_CAP_CR,
 };
index b8c9188..1cef2c3 100644 (file)
@@ -140,6 +140,7 @@ static void rpza_decode_stream(RpzaContext *s)
         /* Skip blocks */
         case 0x80:
             while (n_blocks--) {
+              if (!s->avctx->cr_available) {
                 block_ptr = row_ptr + pixel_ptr;
                 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
                     for (pixel_x = 0; pixel_x < 4; pixel_x++){
@@ -148,7 +149,8 @@ static void rpza_decode_stream(RpzaContext *s)
                     }
                     block_ptr += row_inc;
                 }
-                ADVANCE_BLOCK();
+              }
+              ADVANCE_BLOCK();
             }
             break;
 
@@ -264,21 +266,36 @@ static int rpza_decode_frame(AVCodecContext *avctx,
 {
     RpzaContext *s = (RpzaContext *)avctx->priv_data;
 
+       /* no supplementary picture */
+       if (buf_size == 0)
+               return 0;
+
     s->buf = buf;
     s->size = buf_size;
 
     s->frame.reference = 1;
+       s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE;
+    if (avctx->cr_available)
+        s->frame.buffer_hints |= FF_BUFFER_HINTS_REUSABLE;
+    else
+        s->frame.buffer_hints |= FF_BUFFER_HINTS_READABLE;
     if (avctx->get_buffer(avctx, &s->frame)) {
         av_log(avctx, AV_LOG_ERROR, "  RPZA Video: get_buffer() failed\n");
         return -1;
     }
 
+    if (s->prev_frame.data[0] &&(s->frame.linesize[0] != s->prev_frame.linesize[0]))
+        av_log(avctx, AV_LOG_ERROR, "Buffer linesize changed: current %u, previous %u.\n"
+                "Expect wrong image and/or crash!\n",
+                s->frame.linesize[0], s->prev_frame.linesize[0]);
+
     rpza_decode_stream(s);
 
     if (s->prev_frame.data[0])
         avctx->release_buffer(avctx, &s->prev_frame);
 
     /* shuffle frames */
+  if (!avctx->cr_available)
     s->prev_frame = s->frame;
 
     *data_size = sizeof(AVFrame);
@@ -307,5 +324,5 @@ AVCodec rpza_decoder = {
     NULL,
     rpza_decode_end,
     rpza_decode_frame,
-    CODEC_CAP_DR1,
+    CODEC_CAP_DR1 | CODEC_CAP_CR,
 };