Encoding x264/MKV, bad playback near end of title?
I am very new to ripping VHS and storing them but here is what I have so far and the issue I am hitting.
I am ripping on an i7 64bit XP Pro machine with 8GB of RAM using an old school Tevion USB Capture device with the USB2800 drivers. The captured masters are 720x480 @ 29.970 FPS with huffyuv and audio at Stereo 48khz I don't remember the model VCR (I am not at home right now to check) The master captures to me look good. I am then using AviSynth scripts to filter/process the capture and pulling the avs into VirtualDub to render the production copy as MKV using x264 with default settings. Here is where the issue arises... The MKV Plays just fine and looks absolutely brilliant on my 70" in the living room. All is good until around the last 30 mins of the title, the video and audio go insane, image is entirely scrambled, blocked, audio turns into static/screeching. I don't have a sample to upload right now but I have had the same exact result on two conversions so far. I have no idea what is going wrong. The rendering/dubbing/conversion completes without issue on the machine. No errors reported etc. It is just on each attempt (14hrs running) the end of the title goes nuts. I will try to upload a sample later but if anyone has any ideas right off the bat, please let me know. I will also attach my avisynth scripts later too. -- merged -- I haven't been able to upload samples yet. Been tied down with work/family. I did another test converting an AVI encoded with lagarith to x264 and same exact result. The MKV plays but near the end everything goes nuts. The master avi doesn't have the issue though. Just the conversion. -- merged -- Here is the AVS Script I am using. I have tried it on 4 different files all with the same result. The movie plays great until about 50 mins or so in then goes nuts. Green blocking, scrambled image, screeching audio etc. These things look surprisingly good on our living room 70 inch after this script. So I really want this thing to work. Code:
import("C:\Program Files (x86)\AviSynth\plugins\TemporalDegrain.avs") I am going to do another run tonight but this time I am not changing compression. Maybe something during the change from lagarith to h264 or divx is causing issues. So I am not changing, just going to process the frames with the avs script and see what happens. -- merged -- So the file plays fine on one PC in both windows media player and vlc but on my main pc, the file cannot play in windows media player and 2 minutes into vlc playback it messed up. It started going crazy with deinterlacing unfolded, bad audio, video looks to restart itself unfolded etc. I opened that same file in Kodi media center and it played without issue in Kodi. I am totally lost as to what is going on here. Neither computer have any special codecs installed. I converted this file to h264 and same results as above. I now have it as a .mkv with all the modifcations from the avisynth scripts. I just don't know why it only plays right in Kodi. |
Thanks for the script. It would have been instructive to see why the original video required some of these steps, so at this point no one can say whether the script really "worked" or not. But if it made you happy....
Quote:
Quote:
Why resizing before deinterlacing? Gratuitous Resizing always costs. I see you later used DeHalo_Alpaha to subdue edge halos but first ran Spline64Resize, which accentuates halos and even creates them. Why wait to place the following operation at the very end of your script? Quote:
If you really had to discard 50% of your video, why not do it at the outset instead of spending all that time processing the whole business? Just use: Code:
QTGMC(preset="fast",FPSDivisor=2) Your encoding and YV12 chroma storage have some problems here: Quote:
I keep wondering what this statement is for: Quote:
|
I skimmed through your response until I have time tomorrow to really read and absorb it.
As my initial post says, I am very new to this. I even referred to "ripping" the VHS which I am told is not the correct term. I assume the correct term is "Capturing" since I know in reality I am not ripping digital data from anything in this case. DVD/BD = Digital Data on compact disc VHS = Analog Data stored on magnetic medium That script is a copy paste job from another forum post that I adjusted the crop on and that is about it. I don't know what 90% of it does but it was the first script I ran that actually cleared up the videos I was testing. They looked remarkably better on the main TV (the 70 inch screen) after that script processed them. By "cleared up" I mean removing comb lines and the pixelation. Also note that I do not have a TBC nor does the VCR have any TBC capability. I know I am not using top of the line equipment and I have more to learn but I am not aiming for studio quality 1080p here. Just decent quality on larger screens. My overall goal is to capture several VHS mostly animated movies and handful of live action. I want to stream them from my media server here in house. So with my limited knowledge it appears the best thing is to capture in huffyuv or lagarith on default settings. Then edit and clean them up as best as possible for streaming using Avisynth or VirtualDub or a combination of both etc. Which is what I have been testing with. Original captures in either compression look horrible on the large screens due to the pixelation and combing. So I am just trying to clear that up. I will try to attach a few slices of a few different videos for examples. I just don't know when I can get to it. I usually just hit record and walk away because I have a 8 month old child that takes most my time. I only have two full captures right now because I deleted the rest to start over. I have been doing 3-4 captures of each VHS and keeping the one with the least dropped or inserted frames. Some of them drop/insert more than others and my understanding is this can be caused by condition of the tape as well as other equipment. Thanks for the details you have provided so far. I look forward to reading it further and learning some more. |
Quote:
Quote:
I may reply to this thread again later on. As stated, before/after sample clips are helpful for these restoration conversations. |
Ok so if I understand what I have read so far.
Skip ConvertToYV12 ConvertToRGB ConvertToYV12 Skipping these 3 steps entirely as my master copy is already in standard yuy2 and doesn't need conversion at all. Not even to RGB. Do all color work on interlaced yuy2 frames and adjust colors to my own liking. Crop should ideally be Mod8 (multiple of 8) if I understand that correctly as well. Ok so I am pretty sure I know how "interlacing" vs "Progressive" works. Correct me if my knowledge is wrong. 640, 720, 1080i is literally an image interlaced on screen hence the "i". 640 = VHS quality 720 = DVD/SD 1080 = BD Interlacing is a frame or image drawn using even and odd lines of data. I assume this means all the even lines are drawn first than the odd lines interlaced but it can go the other way. Isn't that what Top Field First and Bottom Field First means? Interlacing can happen with all Top or Bottom drawn first. When the viewing device can draw the lines smoothly and quick enough. You have a full resolution frame without lost data. Otherwise you see the comb lines as the interlacing is done. Typically TV's are able to interlace an image at a speed that makes comb lines invisible to the human eye. 640, 720, 1080p are all progressive so each line is drawn one by one in order of top to bottom. The faster they are down the smoother the action on screen appears. Quote:
I think that is why SelectEven() was the last step. It was to essentially go to progressive after all edits/corrections were done on a full set of data. I mean even if keeping the capture for digital streaming only, does it really have to go to progressive (deinterlace) wouldn't all playback devices/viewing devices be able to properly interlace the video without comb lines anyways? My ultimate goal is to just capture these tapes and stream them without them looking blocky and pixelated on the main tv. So below is what I have so far if I understand correctly. Capture masters at huffyuv yuy2 at 720x480 29.970 FPS (This is good) Adjust colors to my liking and crop to a mod8 that eliminates bottom noise and any black bars from capturing at 720x480 Then I am stuck on what is next. Do I need to resize to help it look better on larger screens? Can you really re-master a VHS to say 720 and still have it look good? Why does the script I posted help clear up so much of the pixelation and blockiness? I know without example videos you guys have no way to determine the level of pixelation. Sorry, I will try to get those here as soon as I can. |
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
For instance, PC monitors don't deinterlace, and neither do video editors when they displayed the unprocessed interlaced source. Quote:
Adjust colors to my liking and crop to a mod8 that eliminates bottom noise and any black bars from capturing at 720x480 Quote:
Code:
AddBorders(8,4,10,6) - Re-interlaced and encoded with a 4:3 display aspect ratio for DVD (which is an interlaced format), - Re-interlaced and encoded with a 4:3 display aspect ratio for standard definition BluRay disc (which is required to be interlaced), - or as progressive or interlaced 4:3 display aspect ratio as h.264 mp4 or mkv, for servers, USB stick with smart TV's or external media players. When you play a 4:3 video on any device, the black border pixels pixels will match any black border pixels that a 4:3 or 16:9 would add to areas that don't have image content. Haven't you noticed that many movies on TV aren't 16:9? Hollywood uses 4:3, 1.37:1, 1.66:1, 1.85:1, 2.0:1, 2.35:1, 2.4:1, and several other aspect ratios. Those movies appear on cable broadcasts, streamed broadcasts, DVD's, and Bluray. None of those aspect ratios will fill a 16:9 TV screen. Haven't you noticed black border areas on the tip and sides of those broadcasts? And by the way, most of those TV broadcasts are interlaced. On most TV's nowadays, thin black borders often art not noticed because of TV overscan covers them (yes, HDTV's use overscan by default, and it can be returned off on almost all TV displays). Quote:
Quote:
on the app's top main menu Click "Video...", then on the drop-down menu click "Direct stream copy". Then save your sample as AVI with a new name and post it here. Give the file time to upload, which will take a few minutes. Some basics about DVD and BluRay formats: Standard DVD, usually 720x480 or 704x480, almost always interlaced or telecined, almost always played as interlaced, aspect ratio 4:3 or 16:9 only (720x480 preferred for 16:9), MPEG codec, dolby AC3 audio. BluRay standard disc (MPEG, h.264, or VC1 encoding ): - 720x480 (NTSC), interlaced only @ 29.97 (NTSC), 4:3 or 16:9 only (720x480 required for 16:9) - 720x576 (PAL), interlaced only @ 25fps (PAL), 4:3 or 16:9 only (720x576 required for 16:9) - 1280x720, progressive only, 59.974 or 50 fps, 16:9 only - 1280x720, progressive only, 24 fps, 16:9 only - 1280x720, progressive only, 23.976 fps, 16:9 only - 1440x1080, interlaced only, 29.97 or 25 fps, 16:9 only - 1440x1080, progressive only, 24 fps, 16:9 only - 1440x1080, progressive only, 23.976 fps, 16:9 only - 1920x1080, interlaced only, 29.97 or 25 fps, 16:9 only - 1920x1080, progressive only, 24 fps, 16:9 only - 1920x1080, progressive only, 23.976 fps, 16:9 only Also note the following: 720 and 704 qualify as mod8 and as mod16 480 qualifies as mod8 and as mod16 1280 qualifies as mod8 and as mod16 1440 qualifies as mod8 and as mod16 1920 qualifies as mod8 and as mod16 1080 qualifies as mod8 but not as mod16 Many Avisynth and VirtualDub filters require mod8 dimensions to operate properly. ================================== Here's how you could modify your script for output to your server. I take it that your server isn't smart enough to handle interlaced or telecined video. The script's output is progressive at 59.974 fps and maintains the original temporal resolution and detail, which should not be a problem. If it is, get a better server. Encode the results as 720x480 with a 4:3 Display Aspect Ratio (DAR). The script will not repair dot crawl or the geometric distortion effects of scan-line timing errors due to lack of a line-level tbc. Line timing errors can't be repaired after capture. Code:
import("C:\Program Files (x86)\AviSynth\plugins\TemporalDegrain.avs") That's a very old copy of DeHalo_Alpha. It has long since been encoded as a .dll. If you'd like to encode for DVD or BluRay, you have to re-interlace the video produced by the above script, which will return the bitrate to 29.97 fps. Code:
### --- adjust the path and file name to match your system --- ### |
Answered in order of your reply
Quote:
I am saying here that 640,720,1080 can all be "i" which is interlaced. Yes they can also be "p" I know that already. I can see I got the VHS resolution wrong. It appears that common NTCS VHS is about 333x480 So maybe that is what you are saying is incorrect. I am still trying to educate myself a bit about the resolutions and relation to luma/chroma etc. Quote:
Quote:
Quote:
Quote:
So it trashed half the processed frames. Quote:
Quote:
Quote:
So even though playback is via Kodi on PC, does the TV itself still handle the deinterlacing properly or am I forced to go progressive in my use case? The pixelation and blockiness I was seeing on my PC Monitor. I would open the master AVI in VLC or Windows Media Player and put it full screen. The image is blurred and blocky around things like peoples faces and such. So I referred to this as pixelation, it seems to be an affect of stretching to full screen. As when the image is kept at the default aspect ratio you cannot see the blurred edges around faces and objects. Hope I explained that better now. Additional notes/repsonses Your responses have been extremely helpful so thank you for taking the time to write them. Your last response here especialy with cropping/borders has clarified quite a lot for me. From that response I am gathering that even though I am playing these files from a PC I can still use interlaced footage with a 4:3 DAR. I am familiar with broadcasts and the "Black Bars" you are talking "Widescreen" format vs "Standard" 16:9 has top and bottom bars even on a widescreen TV and 4:3 on a widescreen tv will have Top/Bottom/Left/Right when kept in 4:3 DAR and not stretched out etc. If I am understanding that correctly. Quote:
In your script since I am already dealing with a master in yuy2, does it need conversion to RGB or later to YV12? My understanding is YUY2 is better. I also read that RGB24 would provide the best output. I am not worried about file sizes so if processing is easier to keep it in YUY2 I can go that route. I am just trying to understand the why and how each step works together that is all. I plan to do more reading soon on YUY2/YV12/RGB etc. to further educate myself on them. System has 2 hard drives. C:\ = OS Drive D:\ = Captures Drive I capture to D then take the final master capture I want to keep and move it to C So when encoding for a final production copy, I am reading the master from C and storing the new encoded copy on D So at no point in time am I writing what I am outputting to the same drive the OS is operating on. Unfortunately I just don't have funds for TBC equipment. This has been a fairly educative project. I just want to capture my VHS tapes and have the ability to watch them on the main TV with as clear a picture as possible given my equipment. This way my 8 month old daughter can watch them. Most of them are animated films (You can easily guess which studio they are from LOL) I could just hook the VCR right to the TV but where is the fun in that. Plus having these tapes on digital means I can keep tapes stored somewhere safe. |
1 Attachment(s)
Quote:
Many users attempt to identify quality with frame size. A 1920x1080 video can look like total garbage, as tons of YouTube and other internet posts will quickly demonstrate. The first requirement of high definition is that the source has high definition to begin with, not just a big frame size. Industrial digital video masters are many times larger and more detailed than DVD or BluRay formats, and many are even "bigger" that 4K videos. As for VHs, yes, it's a lower quality and lower resolution source than even plain vanilla retail DVD. But that's all the more important in the area of capture, restoration and encoding. A good capture and skillful processing can often look as clean as DVD and can create output that improves the source capture many times over. A poor (i.e., average) capture with lesser players, no time base correction, poor signal level control, etc., can't compete with proper hardware, software, and processing optimized for VHS. No, it will not "look like" a 1920x1080 retail BluRay or a digital capture made with an HD-PVR from an HD broadcast (and many newbies think that upscaling VHS to huge frames will give such results, but are always severely disappointed). Still, anyone can make VHS look pretty darn nice with the proper tools. There are many forum examples here and elsewhere. There are also many examples of poor tape condition, poor playback and poor capture that readily reveal their limitations, even with decent processing. Quote:
Note that VLC player doesn't deinterlace or handle telecine properly by default. You have to set deinterlacing permanently to Auto using VLC's options menu. VLC can often trip up on many videos, with occasional image breakup, pixelation, stutter, and freezing. Windows Media Player is another story, and a sad one. Each new version of that software is worse than before. Microsoft has disabled most of its classic controls, and the newest version has most of the formerly built-in codecs removed. The free Media Player Classic and MPC-BE are better, even in their older versions. Quote:
An interlaced frame consists of two images. Each image is from a different instant in time. The two images are stored on alternating horizontal scanlines, so that one image is stored on even-numbered lines and the other is on odd-numbered lines. The two images in the frame are referred to as fields -- there are two 720x240 half-height fields in each interlaced frame. When a 29.97 frames per second interlaced video is played by a proper deinterlacing device, the device interprets the video into its two distinct images and displays both images, one image at a time, at the rate of 59.94 full-sized images (fields) per second. Interlaced PAL video encoded at 25 interlaced frames per second is displayed at 50 fields per second. Similarly, a software deinterlacing filter like QTGMC or yadif (there are several others) interprets 29.97 interlaced frames into 59.94 double-rate half-height fields per second, then uses various algorithms to resample the 59.94 half-height fields into 59.94 full-sized "new" progressive frames for every second of video. When you deinterlace and discard alternate frames, you return the frame rate to its original 29.97 fps. But you now have only half the number of images that defined motion and other details, so that you lose 50% of the original temporal resolution. When your 29.97 fps decimated video plays on your 60Hz TV or PC device, each 1/29.97-second progressive image is displayed twice as long to maintain the display's 60Hz-per-second refresh rate. The resulting motion display is less smooth and less clear than 60 distinct images per second, and the effects become more evident with faster motion and with more image detail to render. Quote:
http://www.infognition.com/tutorials...nterlaced.html Neuron2_How To Analyze Video Frame Structure.zip http://www.digitalfaq.com/forum/atta...-analyze-video Quote:
Quote:
In video processing I've managed to avoid the hooplah and colorful b.s. used to market high-priced "pro" software. Obviously I can't afford the Real Stuff that Disney and Industrial Light & Magic use, but I can afford to learn to use Avisynth and VirtualDub for free, making me neither a "software snob" nor a "price snob". The most expensive software I own is from TMPGenc and an ancient version of AfterEffects released before Adobe screwed up that product. My PC's are home made, and while I have a Win7 laptop everything else is XP. I'm not using $1000 capture cards; I stuck with All in Wonders purchased years ago for XP and with a newer $40 VC500 for Windows 7 capture. I gave up on my pricey AG-1980 VCR for most projects and found that a more mainstream Panasonic SVHS and tbc pass-thru was tracking damaged tapes better, even if it means more Avisynth cleanup after capture. Samples of those initial captures and projects finished with the tools mentioned here, with some of the nightmare problems that came with them, have been posted in this forum. They serve to demonstrate that bad tape can look pretty good with better tools and methods, and that price isn't always the answer. I don't understand what you mean by stretching a video to fill the screen. 4:3 video and aspect ratio's other than 16:9 won't fill a 16:9 screen without distortion. The only aspect ratio that will exactly fill a 16:9 screen completely without distorting the image is 16:9. When I visit people who stretch the image to fit their screen, I usually find something else to do other than watch their TV. The distortion is really annoying, not to mention that watching a good looking actress fattened or squished or zoomed is just plain ugly. Standard definition from DVD and SD-BluRay and even from properly processed VHS captures looks and performs adequately and is a big improvement (in some respects) over the same thing seen with CRT displays (LCD motion rendering, color accuracy, and contrast range being exceptions). Since all display devices are not equal, some players and displays can upsample better than others, some can handle telecine better than others. You can't judge by what you see in the usual showroom, because those demo videos and showroom display settings are purposely designed to mask defects. There is too much advanced testing of computer displays, playback machines, TV's, and audio gear available elsewhere than to trust big-store showrooms. Quote:
Distortion due to line sync errors is more elusive to find. The image below is an example of one type of distortion, which is frame warping. In this case the scanlines that define the bottom and middle of the frame arrive "earlieR' at the capture device than scanlines that define the upper part. The result is left and right borders that are warped toward the left near the top of the frame. http://www.digitalfaq.com/forum/atta...1&d=1530160271 Wonder why that frame looks a bit fuzzy? Obviously the guy running is blurry, but elsewhere one reason is that the edges are affected by scanline timing errors; the lines that define the edges don't all arrive "on time" at the capture device. Another form of distortion is small "notches' in side borders, as well as wrinkles, notches, and warps in verticals and diagonals that change shape with every frame. These moving distortions make for noisy edges and poor encoder performance. Here are 4x enlargement samples of line wiggle fixed by line-level tbc devices: http://forum.videohelp.com/threads/3...=1#post1882662 https://forum.videohelp.com/threads/...hs#post2521850 pictures of line distortion corrected with an ES15 pass-thru tbc. http://forum.videohelp.com/threads/3...=1#post1983288 Quote:
RGB is used for color correction when YUV's limits become evident. RGB is also used for display and sometimes for resizing. But I don't know what you mean by RGB being "better'. Video isn't normally encoded as RGB but as YV12, although other colorspaces are possible for various reasons. Remember that standard YUV levels of 16-235 for luma and chroma are expanded to 0-255 when converted to RGB. YUV levels that exceed legal limits can be problematic in RGB, when data at the extremes gets clipped (destroyed). Quote:
Quote:
Many solve the problem by using a pass-thru for a tbc, such as an old used Panasonic DMR-ES10 or ES15, which is tons cheaper than "regular" tbc devices but very effective. Excellent y/c filters, too, for cleaning up dot crawl. https://forum.videohelp.com/threads/...-you-use/page4 Quote:
Good luck in your project and with your family. |
1 Attachment(s)
Here is a clip from the master capture. I finally got a second to sit down and cut it.
Oscar_master_clip Not exactly the best capture in the world I am sure but it will suffice if I can just make it look decent on the larger screen. Below is the copy of the AVS script I have been working on for it. As you can see all I have done is the cropping and borders. I am horrible with math so I haven't tried figuring out how to calculate the crop vs borders to center the image and still arrive at 720x480. I think I have it right as the aspect ratio is correct and the image looks centered to me. Code:
import("C:\Program Files (x86)\AviSynth\plugins\TemporalDegrain.avs") |
5 Attachment(s)
Thank you for your sample.
I can do some work on it in a few days, as I'm traveling now with a laptop that is impossible for video work. But I think you should know that your sample is telecined with 3:2 pulldown. You should not run deinterlace filters on this type of video. You should be using TIVTC (inverse telecine). -- merged -- Again, thanks for the sample and your script. First, the version of DeHalo_Alpha you are using downloads as an .avsi script. If an .avsi plugin is in your Avisynth plugins folder, it loads automatically when the script calls it -- there is no need to copy the text of an .avsi plugin into your script. DeHalo_ALpha isn't called in yourb script anyway, but you should note that the filter should be used only on progressive video. O)Obviously your script doesn't so anything except crop and replace borders. But why are you using a pink border, and why are you cropping off so much of the image? Quote:
There is a visible difference between time taken for cleaning up defects and skipping cleanup altogether. The top image below shows one frame with the horizontal rip visible, the bottom image shows some denoising, standard black borders, and color correction. I couldn't clean up all the original chroma smearing without destroying more detail: original script http://www.digitalfaq.com/forum/atta...1&d=1530786073 new script http://www.digitalfaq.com/forum/atta...1&d=1530786073 Your video is telecined with 3:2 pulldown. Two of every five frames contain duplicated fields and appear as interlaced, the other three frames appear as progressive. The telecine is hard-coded, meaning it's physically part of the pulldown frames rather than data flags that tell a player which fields or frames to repeat to simulate 29.97 fps playback. On playback, a hard-telecined movie plays on most devices as interlaced. Removing the pulldown fields using the TIVTC plugin restores the frame rate to the movie's original 23.976 fps. The TIVTC plugins works in YUY2 and YV12. The original color balance is too red. Most people correct red by adding blue, which is not correct. The opposite of red isn't blue, it's cyan (blue-green). Adding blue alone makes red pink. The original vido looks dim because upper mids and brights are subdued, and black levels are a bit high. I made initial corrections in YUY2 and tweaked mids and brights with ColorMill in Virtualdub and RGB. I avoided adding a lot of cyan and brighter colors because the movie appears to be trying to simulate the muted, warmish color of early 30's films and because the lighting in the scene is not bright daylight (it's overcast light modified with warming filters. You can see there are no strong shadows in any of the shots). The Virtualdub filters I used were ColorMill and Color Camcorder Denoise. I have attached a .vcf text file that recorded those settings. To use a .vcf, open VirtualDub and click "File..." -> "Load processing settings...", then locate the ,vcf file and click "OK" or "Open". The .vcf will load the two filters and the settings I used. ColorMill and Color Camcorder Denoise must be in your VDub plugins. If you don't have those filters, they were previously posted in this link http://www.digitalfaq.com/forum/atta...dubfilters4zip packaged with two other VDub filters. The script below doesn't attempt to fix the horizontal rips, which required special treatment. But it does perform inverse telecine and some denoising and levels correction. Note that QTGMC is not used here to de-interlace, but is used for denoising progressive video ("InputType=2") and for smoothing some of the tracking shimmer in the original capture. The Santiag plugin is used to calm some bad aliasing and line twitter. The result is encoded as the attached "Oscar_23_976.mp4)" which plays at 23.976 film speed at 4:3 aspect ratio. Code:
AviSource("E:\forum\faq\KalterStein\Oscar_Master_Clip.avi") I realize that you say you don't have time for this level of restoration. But it does illustrate the possibilities. You will still see some slight remnants of aliasing and line twitter (I think that's what byou were referring to as "pixelation"). That's partly a vcr playback problem, and partly a broadcast quality problem. It's possible to fix even more, but there wouldn't be much video left to watch. After you're finished, keep the tapes you really want. You might find more time and players in the future for better captures. Code:
Import("D:\Avisynth 2.5\plugins\ReplaceFRamesMC2.avs") |
Site design, images and content © 2002-2024 The Digital FAQ, www.digitalFAQ.com
Forum Software by vBulletin · Copyright © 2024 Jelsoft Enterprises Ltd.