Advertisement
Guest User

Untitled

a guest
Feb 12th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.48 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void spice_error(const char *msg, ...) { fprintf(stderr, "Ooops\n"); }
  5.  
  6. #define G_LIKELY(expr) (__builtin_expect ((_Bool)((expr)), 1))
  7.  
  8. #define spice_assert(x) do {                  \
  9.     if G_LIKELY(x) { } else {                           \
  10.         spice_error("assertion `%s' failed", #x);       \
  11.     }                                                   \
  12. } while(0);
  13.  
  14. /* bppmask[i] contains i ones as lsb-s */
  15. static const unsigned int bppmask[33] = {
  16.     0x00000000, /* [0] */
  17.     0x00000001, 0x00000003, 0x00000007, 0x0000000f,
  18.     0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
  19.     0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
  20.     0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
  21.     0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
  22.     0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
  23.     0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
  24.     0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff /* [32] */
  25. };
  26.  
  27. typedef unsigned uint32_t;
  28.  
  29. typedef enum {
  30.     QUIC_IMAGE_TYPE_INVALID,
  31.     QUIC_IMAGE_TYPE_GRAY,
  32.     QUIC_IMAGE_TYPE_RGB16,
  33.     QUIC_IMAGE_TYPE_RGB24,
  34.     QUIC_IMAGE_TYPE_RGB32,
  35.     QUIC_IMAGE_TYPE_RGBA
  36. } QuicImageType;
  37.  
  38. typedef struct Encoder {
  39.     void *usr;
  40.     QuicImageType type;
  41.     unsigned int width;
  42.     unsigned int height;
  43.  
  44.     unsigned int n_buckets_8bpc;
  45.     unsigned int n_buckets_5bpc;
  46.  
  47.     unsigned int io_available_bits;
  48.     uint32_t io_word;
  49.     uint32_t io_next_word;
  50.     uint32_t *io_now;
  51.     uint32_t *io_end;
  52.     uint32_t io_words_count;
  53.  
  54.     int rows_completed;
  55. } Encoder;
  56.  
  57. #define write_io_word(encoder) 0
  58.  
  59.  
  60. static inline void encode(Encoder *encoder, unsigned int word, unsigned int len)
  61. {
  62.     int delta;
  63.  
  64.     if ((delta = ((int)encoder->io_available_bits - len)) >= 0) {
  65.         encoder->io_available_bits = delta;
  66.         encoder->io_word |= word << encoder->io_available_bits;
  67.         return;
  68.     }
  69.     delta = -delta;
  70.     encoder->io_word |= word >> delta;
  71.     write_io_word(encoder);
  72.     encoder->io_available_bits = 32 - delta;
  73.     encoder->io_word = word << encoder->io_available_bits;
  74.  
  75. }
  76.  
  77.  
  78. int main(int argc, char **argv)
  79. {
  80.     unsigned n = atoi(argv[1]);
  81.     Encoder encoder = { 0 };
  82.     encoder.io_available_bits = 16;
  83.     encoder.io_word = 0;
  84.     for (unsigned i = 0; i < n; i++)
  85.         for (unsigned j = 0; j < 1000000; j++)
  86.             encode(&encoder, bppmask[(j%32)|1], (j%32) | 1);
  87.     fprintf(stderr, "Rows completed: %d\n", encoder.rows_completed);
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement