+/* This function uses for 'smart' releasing of consumed data
+ from the input bitstream fifo.
+ Since the input fifo mapped to mfxBitstream which does not understand
+ a wrapping of data over fifo end, we should also to relocate a possible
+ data rest to fifo begin. If rest of data is absent then we just reset fifo's
+ pointers to initial positions.
+ NOTE the case when fifo does contain unconsumed data is rare and typical
+ amount of such data is 1..4 bytes.
+*/
+static void qsv_fifo_relocate(AVFifoBuffer *f, int bytes_to_free)
+{
+ int data_size;
+ int data_rest = 0;
+
+ av_fifo_drain(f, bytes_to_free);
+
+ data_size = av_fifo_size(f);
+ if (data_size > 0) {
+ if (f->buffer!=f->rptr) {
+ if ( (f->end - f->rptr) < data_size) {
+ data_rest = data_size - (f->end - f->rptr);
+ data_size-=data_rest;
+ memmove(f->buffer+data_size, f->buffer, data_rest);
+ }
+ memmove(f->buffer, f->rptr, data_size);
+ data_size+= data_rest;
+ }
+ }
+ f->rptr = f->buffer;
+ f->wptr = f->buffer + data_size;
+ f->wndx = data_size;
+ f->rndx = 0;
+}
+