]> source.dussan.org Git - tigervnc.git/commitdiff
H264Libav: Handle colour space conversion
authorAndri Yngvason <andri@yngvason.is>
Mon, 19 Aug 2024 22:34:37 +0000 (22:34 +0000)
committerAndri Yngvason <andri@yngvason.is>
Mon, 19 Aug 2024 22:34:37 +0000 (22:34 +0000)
The scaler is now informed of the colour space encoded into the stream
so that it may do the proper conversion.

common/rfb/H264LibavDecoderContext.cxx

index 38210205f3f455e2d119ab414ce7dd9cfc88e8d4..c3153fd15531c0ed3ca33d62f6c1a22912662824 100644 (file)
@@ -217,6 +217,21 @@ void H264LibavDecoderContext::decode(const uint8_t* h264_in_buffer,
                              frame->width, frame->height, AV_PIX_FMT_RGB32,
                              0, nullptr, nullptr, nullptr);
 
+  int inFull, outFull, brightness, contrast, saturation;
+  const int* inTable;
+  const int* outTable;
+
+  sws_getColorspaceDetails(sws, (int**)&inTable, &inFull, (int**)&outTable,
+      &outFull, &brightness, &contrast, &saturation);
+  if (frame->colorspace != AVCOL_SPC_UNSPECIFIED) {
+    inTable = sws_getCoefficients(frame->colorspace);
+  }
+  if (frame->color_range != AVCOL_RANGE_UNSPECIFIED) {
+    inFull = frame->color_range == AVCOL_RANGE_JPEG;
+  }
+  sws_setColorspaceDetails(sws, inTable, inFull, outTable, outFull, brightness,
+      contrast, saturation);
+
   if (rgbFrame && (rgbFrame->width != frame->width || rgbFrame->height != frame->height)) {
     av_frame_free(&rgbFrame);