MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / parse_mpeg2_extension_descriptor

Function parse_mpeg2_extension_descriptor

libavformat/mpegts.c:1850–2017  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1848};
1849
1850static 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) {

Callers 1

Calls 6

get8Function · 0.85
av_logFunction · 0.85
get16Function · 0.85
get_programFunction · 0.85

Tested by

no test coverage detected