]> granicus.if.org Git - handbrake/commitdiff
NAL search fix for small chunk(s)
authorhandbrake <no-reply@handbrake.fr>
Wed, 15 May 2013 15:18:45 +0000 (15:18 +0000)
committerhandbrake <no-reply@handbrake.fr>
Wed, 15 May 2013 15:18:45 +0000 (15:18 +0000)
git-svn-id: svn://svn.handbrake.fr/HandBrake/branches/qsv@5457 b64f7644-9d1e-0410-96f1-a4d463321fa5

contrib/ffmpeg/A00-qsv.patch
libhb/enc_qsv.c

index 1eb5c5c409ea554b2025ba5c0528a9fac358e477..b2ddca6fbb3389dc430e5d2a5e32cf4b2b6e5837 100755 (executable)
@@ -78,7 +78,7 @@ diff -Naur ../../libav-v9.3/libavcodec/Makefile ./libavcodec/Makefile
  OBJS-$(CONFIG_H264_VDA_HWACCEL)        += vda_h264.o
 diff -Naur ../../libav-v9.3/libavcodec/qsv.c ./libavcodec/qsv.c
 --- ../../libav-v9.3/libavcodec/qsv.c  1970-01-01 01:00:00.000000000 +0100
-+++ ./libavcodec/qsv.c 2013-04-17 23:24:35.700898164 +0200
++++ ./libavcodec/qsv.c 2013-05-15 17:13:43.317341393 +0200
 @@ -0,0 +1,621 @@
 +/* ********************************************************************* *\
 +
@@ -217,8 +217,8 @@ diff -Naur ../../libav-v9.3/libavcodec/qsv.c ./libavcodec/qsv.c
 +                return (stage->type << 16) | 2;
 +            if (p_surface == stage->in.p_surface)
 +                return (stage->type << 16) | 1;
-+            }
 +        }
++    }
 +    return ret;
 +}
 +
@@ -410,7 +410,7 @@ diff -Naur ../../libav-v9.3/libavcodec/qsv.c ./libavcodec/qsv.c
 +            for (x = av_qsv_list_count(to_remove_atom_list); x > 0; x--){
 +                to_remove_atom = av_qsv_list_item(to_remove_atom_list, x-1);
 +                av_qsv_flush_stages(list,&to_remove_atom);
-+}
++            }
 +        }
 +        av_qsv_list_close(&to_remove_list);
 +    }
@@ -661,7 +661,7 @@ diff -Naur ../../libav-v9.3/libavcodec/qsv.c ./libavcodec/qsv.c
 +            av_log(NULL, AV_LOG_ERROR, "pthread_mutex_unlock issue[%d] at %s\n",mut_ret, __FUNCTION__);
 +        mut_ret = pthread_mutex_destroy(&l->mutex);
 +        mut_ret = pthread_mutexattr_destroy(&l->mta);
-+}
++    }
 +#endif
 +    av_freep(_l);
 +}
@@ -703,7 +703,7 @@ diff -Naur ../../libav-v9.3/libavcodec/qsv.c ./libavcodec/qsv.c
 +}
 diff -Naur ../../libav-v9.3/libavcodec/qsv.h ./libavcodec/qsv.h
 --- ../../libav-v9.3/libavcodec/qsv.h  1970-01-01 01:00:00.000000000 +0100
-+++ ./libavcodec/qsv.h 2013-04-17 23:24:35.708899156 +0200
++++ ./libavcodec/qsv.h 2013-05-15 17:13:43.321341889 +0200
 @@ -0,0 +1,493 @@
 +/* ********************************************************************* *\
 +
@@ -1200,8 +1200,8 @@ diff -Naur ../../libav-v9.3/libavcodec/qsv.h ./libavcodec/qsv.h
 +#endif                          //AVCODEC_QSV_H
 diff -Naur ../../libav-v9.3/libavcodec/qsv_h264.c ./libavcodec/qsv_h264.c
 --- ../../libav-v9.3/libavcodec/qsv_h264.c     1970-01-01 01:00:00.000000000 +0100
-+++ ./libavcodec/qsv_h264.c    2013-04-17 23:24:35.706898908 +0200
-@@ -0,0 +1,961 @@
++++ ./libavcodec/qsv_h264.c    2013-05-15 17:13:43.320341765 +0200
+@@ -0,0 +1,959 @@
 +/* ********************************************************************* *\
 +
 +Copyright (C) 2013 Intel Corporation.  All rights reserved.
@@ -1276,7 +1276,7 @@ diff -Naur ../../libav-v9.3/libavcodec/qsv_h264.c ./libavcodec/qsv_h264.c
 +    if ((int) size < 4)
 +        return 0;
 +
-+    while ((4 <= size) && ((0 != pb[0]) || (0 != pb[1]) || (1 != pb[2]))) {
++    while ((4 <= size) && ((0 != pb[0]) || (0 != pb[1]) || (0 != pb[2]) || (1 != pb[3]))) {
 +        pb += 1;
 +        size -= 1;
 +    }
@@ -1650,14 +1650,12 @@ diff -Naur ../../libav-v9.3/libavcodec/qsv_h264.c ./libavcodec/qsv_h264.c
 +    }
 +
 +    if (current_size) {
-+
 +        if(qsv->is_anex == ANEX_UNKNOWN){
 +            if (ff_qsv_nal_find_start_code(current_position, current_size) && current_position == avpkt->data)
 +               qsv->is_anex = ANEX_PREFIX;
 +            else
 +               qsv->is_anex = ANEX_NO_PREFIX;
 +        }
-+
 +        if (qsv->is_anex == ANEX_PREFIX){
 +            memcpy(&qsv_decode->bs.Data[0] +
 +                   qsv_decode->bs.DataLength +
@@ -1668,30 +1666,30 @@ diff -Naur ../../libav-v9.3/libavcodec/qsv_h264.c ./libavcodec/qsv_h264.c
 +            frame_length += avpkt->size;
 +        }
 +        else
-+        while (current_offset <= current_size) {
-+            current_nal_size =
-+                ((unsigned char) current_position[current_offset - 2] << 24 |
-+                 (unsigned char) current_position[current_offset -  1] << 16 |
-+                 (unsigned char) current_position[current_offset] << 8 |
-+                 (unsigned char) current_position[current_offset + 1]) - 1;
-+            nal_type =
-+                (unsigned char) current_position[current_offset + 2] & 0x1F;
-+            {
-+                frame_length += current_nal_size;
-+                memcpy(&qsv_decode->bs.Data[0] +
-+                       qsv_decode->bs.DataLength +
-+                       qsv_decode->bs.DataOffset, ff_prefix_code,
-+                       sizeof(ff_prefix_code));
-+                qsv_decode->bs.DataLength += sizeof(ff_prefix_code);
-+                memcpy(&qsv_decode->bs.Data[0] +
-+                       qsv_decode->bs.DataLength +
-+                       qsv_decode->bs.DataOffset,
-+                       &current_position[current_offset + 2],
-+                       current_nal_size + 1);
-+                qsv_decode->bs.DataLength += current_nal_size + 1;
++            while (current_offset <= current_size) {
++                current_nal_size =
++                    ((unsigned char) current_position[current_offset - 2] << 24 |
++                     (unsigned char) current_position[current_offset -  1] << 16 |
++                     (unsigned char) current_position[current_offset] << 8 |
++                     (unsigned char) current_position[current_offset + 1]) - 1;
++                nal_type =
++                    (unsigned char) current_position[current_offset + 2] & 0x1F;
++                {
++                    frame_length += current_nal_size;
++                    memcpy(&qsv_decode->bs.Data[0] +
++                           qsv_decode->bs.DataLength +
++                           qsv_decode->bs.DataOffset, ff_prefix_code,
++                           sizeof(ff_prefix_code));
++                    qsv_decode->bs.DataLength += sizeof(ff_prefix_code);
++                    memcpy(&qsv_decode->bs.Data[0] +
++                           qsv_decode->bs.DataLength +
++                           qsv_decode->bs.DataOffset,
++                           &current_position[current_offset + 2],
++                           current_nal_size + 1);
++                    qsv_decode->bs.DataLength += current_nal_size + 1;
++                }
++                current_offset += current_nal_size + 5;
 +            }
-+            current_offset += current_nal_size + 5;
-+        }
 +
 +        if (qsv_decode->bs.DataLength > qsv_decode->bs.MaxLength) {
 +            av_log(avctx, AV_LOG_FATAL, "DataLength > MaxLength\n");
@@ -2165,7 +2163,7 @@ diff -Naur ../../libav-v9.3/libavcodec/qsv_h264.c ./libavcodec/qsv_h264.c
 +};
 diff -Naur ../../libav-v9.3/libavcodec/qsv_h264.h ./libavcodec/qsv_h264.h
 --- ../../libav-v9.3/libavcodec/qsv_h264.h     1970-01-01 01:00:00.000000000 +0100
-+++ ./libavcodec/qsv_h264.h    2013-04-17 23:24:35.708899156 +0200
++++ ./libavcodec/qsv_h264.h    2013-05-15 17:13:43.335343623 +0200
 @@ -0,0 +1,64 @@
 +/* ********************************************************************* *\
 +
index 327256ce08dc43d85839205b1e42a975532f998e..fd0af736634dfb408b757245f913a0d30df79456 100644 (file)
@@ -982,7 +982,8 @@ int nal_find_start_code(uint8_t** pb, size_t* size){
     while ((4 <= *size) &&
         ((0 != (*pb)[0]) ||
          (0 != (*pb)[1]) ||
-         (1 != (*pb)[2]) ))
+         (0 != (*pb)[2]) ||
+         (1 != (*pb)[3]) ))
     {
         *pb += 1;
         *size -= 1;