History

avisynth: more intelligent RGB flipping

avs_is_color_space provides a generic way of checking whether the video is RGB, and has been available through AVSC_API since 2.6. This means that GetProcAddress doesn't have to run on every frame.

Stephen Hutchinson committed 6 years ago

Commit 4c406861 parent 9f1b8081 file · +5 −22Browse files

Unified · Split

libavformat/avisynth.c+5−22
@@ -57,6 +57,7 @@ typedef struct AviSynthLibrary { · 56 unmodified lines
57 AVSC_DECLARE_FUNC(avs_get_version);57 AVSC_DECLARE_FUNC(avs_get_version);
58 AVSC_DECLARE_FUNC(avs_get_video_info);58 AVSC_DECLARE_FUNC(avs_get_video_info);
59 AVSC_DECLARE_FUNC(avs_invoke);59 AVSC_DECLARE_FUNC(avs_invoke);
60 AVSC_DECLARE_FUNC(avs_is_color_space);
60 AVSC_DECLARE_FUNC(avs_release_clip);61 AVSC_DECLARE_FUNC(avs_release_clip);
61 AVSC_DECLARE_FUNC(avs_release_value);62 AVSC_DECLARE_FUNC(avs_release_value);
62 AVSC_DECLARE_FUNC(avs_release_video_frame);63 AVSC_DECLARE_FUNC(avs_release_video_frame);
@@ -133,6 +134,7 @@ static av_cold int avisynth_load_library(void) · 70 unmodified lines
133 LOAD_AVS_FUNC(avs_get_version, 0);134 LOAD_AVS_FUNC(avs_get_version, 0);
134 LOAD_AVS_FUNC(avs_get_video_info, 0);135 LOAD_AVS_FUNC(avs_get_video_info, 0);
135 LOAD_AVS_FUNC(avs_invoke, 0);136 LOAD_AVS_FUNC(avs_invoke, 0);
137 LOAD_AVS_FUNC(avs_is_color_space, 1);
136 LOAD_AVS_FUNC(avs_release_clip, 0);138 LOAD_AVS_FUNC(avs_release_clip, 0);
137 LOAD_AVS_FUNC(avs_release_value, 0);139 LOAD_AVS_FUNC(avs_release_value, 0);
138 LOAD_AVS_FUNC(avs_release_video_frame, 0);140 LOAD_AVS_FUNC(avs_release_video_frame, 0);
@@ -628,7 +630,6 @@ static int avisynth_read_packet_video(AVFormatContext *s, AVPacket *pkt, · 489 unmodified lines
628 const unsigned char *src_p;630 const unsigned char *src_p;
629 int n, i, plane, rowsize, planeheight, pitch, bits, ret;631 int n, i, plane, rowsize, planeheight, pitch, bits, ret;
630 const char *error;632 const char *error;
631 int avsplus av_unused;
632 633
633 if (avs->curr_frame >= avs->vi->num_frames)634 if (avs->curr_frame >= avs->vi->num_frames)
634 return AVERROR_EOF;635 return AVERROR_EOF;
@@ -638,19 +639,6 @@ static int avisynth_read_packet_video(AVFormatContext *s, AVPacket *pkt, · 3 unmodified lines
638 if (discard)639 if (discard)
639 return 0;640 return 0;
640 641
641#ifdef _WIN32
642 /* Detect whether we're using AviSynth 2.6 or AviSynth+ by
643 * looking for whether avs_is_planar_rgb exists. */
644 if (GetProcAddress(avs_library.library, "avs_is_planar_rgb") == NULL)
645 avsplus = 0;
646 else
647 avsplus = 1;
648#else
649 /* AviSynth+ is now the only variant of AviSynth we support
650 * on Linux and macOS. */
651 avsplus = 1;
652#endif
653
654 bits = avs_library.avs_bits_per_pixel(avs->vi);642 bits = avs_library.avs_bits_per_pixel(avs->vi);
655 643
656 /* Without the cast to int64_t, calculation overflows at about 9k x 9k644 /* Without the cast to int64_t, calculation overflows at about 9k x 9k
@@ -687,14 +675,9 @@ static int avisynth_read_packet_video(AVFormatContext *s, AVPacket *pkt, · 30 unmodified lines
687 planeheight = avs_library.avs_get_height_p(frame, plane);675 planeheight = avs_library.avs_get_height_p(frame, plane);
688 676
689 /* Flip RGB video. */677 /* Flip RGB video. */
690 if (avs_is_rgb24(avs->vi) || avs_is_rgb(avs->vi)) {678 if (avs_library.avs_is_color_space(avs->vi, AVS_CS_BGR) ||
691 src_p = src_p + (planeheight - 1) * pitch;679 avs_library.avs_is_color_space(avs->vi, AVS_CS_BGR48) ||
692 pitch = -pitch;680 avs_library.avs_is_color_space(avs->vi, AVS_CS_BGR64)) {
693 }
694
695 /* Flip Planar RGB video */
696 if (avsplus && (avs_library.avs_is_planar_rgb(avs->vi) ||
697 avs_library.avs_is_planar_rgba(avs->vi))) {
698 src_p = src_p + (planeheight - 1) * pitch;681 src_p = src_p + (planeheight - 1) * pitch;
699 pitch = -pitch;682 pitch = -pitch;
700 }683 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t