| 1848 | }; |
| 1849 | |
| 1850 | static int parse_mpeg2_extension_descriptor(AVFormatContext *fc, AVStream *st, int prg_id, |
| 1851 | const uint8_t **pp, const uint8_t *desc_end, |
| 1852 | MpegTSContext *ts) |
| 1853 | { |
| 1854 | int ext_tag = get8(pp, desc_end); |
| 1855 | |
| 1856 | switch (ext_tag) { |
| 1857 | case JXS_VIDEO_DESCRIPTOR: /* JPEG-XS video descriptor*/ |
| 1858 | { |
| 1859 | int horizontal_size, vertical_size, schar; |
| 1860 | int colour_primaries, transfer_characteristics, matrix_coefficients, video_full_range_flag; |
| 1861 | int descriptor_version, interlace_mode, n_fields; |
| 1862 | unsigned frat; |
| 1863 | |
| 1864 | if (desc_end - *pp < 29) |
| 1865 | return AVERROR_INVALIDDATA; |
| 1866 | |
| 1867 | descriptor_version = get8(pp, desc_end); |
| 1868 | if (descriptor_version) { |
| 1869 | av_log(fc, AV_LOG_WARNING, "Unsupported JPEG-XS descriptor version (%d != 0)", descriptor_version); |
| 1870 | return AVERROR_INVALIDDATA; |
| 1871 | } |
| 1872 | |
| 1873 | horizontal_size = get16(pp, desc_end); |
| 1874 | vertical_size = get16(pp, desc_end); |
| 1875 | *pp += 4; /* brat */ |
| 1876 | frat = bytestream_get_be32(pp); |
| 1877 | schar = get16(pp, desc_end); |
| 1878 | *pp += 2; /* Ppih */ |
| 1879 | *pp += 2; /* Plev */ |
| 1880 | *pp += 4; /* max_buffer_size */ |
| 1881 | *pp += 1; /* buffer_model_type */ |
| 1882 | colour_primaries = get8(pp, desc_end); |
| 1883 | transfer_characteristics = get8(pp, desc_end); |
| 1884 | matrix_coefficients = get8(pp, desc_end); |
| 1885 | video_full_range_flag = (get8(pp, desc_end) & 0x80) == 0x80 ? 1 : 0; |
| 1886 | |
| 1887 | interlace_mode = (frat >> 30) & 0x3; |
| 1888 | if (interlace_mode == 3) { |
| 1889 | av_log(fc, AV_LOG_WARNING, "Unknown JPEG XS interlace mode 3"); |
| 1890 | return AVERROR_INVALIDDATA; |
| 1891 | } |
| 1892 | |
| 1893 | st->codecpar->field_order = interlace_mode == 0 ? AV_FIELD_PROGRESSIVE |
| 1894 | : (interlace_mode == 1 ? AV_FIELD_TT : AV_FIELD_BB); |
| 1895 | n_fields = st->codecpar->field_order == AV_FIELD_PROGRESSIVE ? 1 : 2; |
| 1896 | |
| 1897 | st->codecpar->width = horizontal_size; |
| 1898 | st->codecpar->height = vertical_size * n_fields; |
| 1899 | |
| 1900 | if (frat != 0) { |
| 1901 | int framerate_num = (frat & 0x0000FFFFU); |
| 1902 | int framerate_den = ((frat >> 24) & 0x0000003FU); |
| 1903 | |
| 1904 | if (framerate_den == 2) { |
| 1905 | framerate_num *= 1000; |
| 1906 | framerate_den = 1001; |
| 1907 | } else if (framerate_den != 1) { |
no test coverage detected