Mercurial > libavformat.hg
comparison matroskadec.c @ 2973:910ac68ab3b5 libavformat
Add support for Matroska attachments.
patch by eugeni _dot_ stepanov _at_ gmail.com and myself
author | aurel |
---|---|
date | Sun, 27 Jan 2008 15:43:17 +0000 |
parents | 616fb87724b5 |
children | 9fefe2df6756 |
comparison
equal
deleted
inserted
replaced
2972:bc330130bdce | 2973:910ac68ab3b5 |
---|---|
1863 } | 1863 } |
1864 | 1864 |
1865 return res; | 1865 return res; |
1866 } | 1866 } |
1867 | 1867 |
1868 static int | |
1869 matroska_parse_attachments(AVFormatContext *s) | |
1870 { | |
1871 MatroskaDemuxContext *matroska = s->priv_data; | |
1872 int res = 0; | |
1873 uint32_t id; | |
1874 | |
1875 av_log(matroska->ctx, AV_LOG_DEBUG, "parsing attachments...\n"); | |
1876 | |
1877 while (res == 0) { | |
1878 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
1879 res = AVERROR(EIO); | |
1880 break; | |
1881 } else if (matroska->level_up) { | |
1882 matroska->level_up--; | |
1883 break; | |
1884 } | |
1885 | |
1886 switch (id) { | |
1887 case MATROSKA_ID_ATTACHEDFILE: { | |
1888 char* name = NULL; | |
1889 char* mime = NULL; | |
1890 uint8_t* data = NULL; | |
1891 int i, data_size = 0; | |
1892 AVStream *st; | |
1893 | |
1894 if ((res = ebml_read_master(matroska, &id)) < 0) | |
1895 break; | |
1896 | |
1897 while (res == 0) { | |
1898 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
1899 res = AVERROR(EIO); | |
1900 break; | |
1901 } else if (matroska->level_up) { | |
1902 matroska->level_up--; | |
1903 break; | |
1904 } | |
1905 | |
1906 switch (id) { | |
1907 case MATROSKA_ID_FILENAME: | |
1908 res = ebml_read_utf8 (matroska, &id, &name); | |
1909 break; | |
1910 | |
1911 case MATROSKA_ID_FILEMIMETYPE: | |
1912 res = ebml_read_ascii (matroska, &id, &mime); | |
1913 break; | |
1914 | |
1915 case MATROSKA_ID_FILEDATA: | |
1916 res = ebml_read_binary(matroska, &id, &data, &data_size); | |
1917 break; | |
1918 | |
1919 default: | |
1920 av_log(matroska->ctx, AV_LOG_INFO, | |
1921 "Unknown attachedfile ID 0x%x\n", id); | |
1922 case EBML_ID_VOID: | |
1923 res = ebml_read_skip(matroska); | |
1924 break; | |
1925 } | |
1926 | |
1927 if (matroska->level_up) { | |
1928 matroska->level_up--; | |
1929 break; | |
1930 } | |
1931 } | |
1932 | |
1933 if (!(name && mime && data && data_size > 0)) { | |
1934 av_log(matroska->ctx, AV_LOG_ERROR, "incomplete attachment\n"); | |
1935 break; | |
1936 } | |
1937 | |
1938 st = av_new_stream(s, matroska->num_streams++); | |
1939 if (st == NULL) | |
1940 return AVERROR(ENOMEM); | |
1941 st->filename = av_strdup(name); | |
1942 st->codec->codec_id = CODEC_ID_NONE; | |
1943 st->codec->codec_type = CODEC_TYPE_ATTACHMENT; | |
1944 st->codec->extradata = av_malloc(data_size); | |
1945 if(st->codec->extradata == NULL) | |
1946 return AVERROR(ENOMEM); | |
1947 st->codec->extradata_size = data_size; | |
1948 memcpy(st->codec->extradata, data, data_size); | |
1949 | |
1950 for (i=0; ff_mkv_mime_tags[i].id != CODEC_ID_NONE; i++) { | |
1951 if (!strncmp(ff_mkv_mime_tags[i].str, mime, | |
1952 strlen(ff_mkv_mime_tags[i].str))) { | |
1953 st->codec->codec_id = ff_mkv_mime_tags[i].id; | |
1954 break; | |
1955 } | |
1956 } | |
1957 | |
1958 av_log(matroska->ctx, AV_LOG_DEBUG, "new attachment: %s, %s, size %d \n", name, mime, data_size); | |
1959 break; | |
1960 } | |
1961 | |
1962 default: | |
1963 av_log(matroska->ctx, AV_LOG_INFO, | |
1964 "Unknown attachments ID 0x%x\n", id); | |
1965 /* fall-through */ | |
1966 | |
1967 case EBML_ID_VOID: | |
1968 res = ebml_read_skip(matroska); | |
1969 break; | |
1970 } | |
1971 | |
1972 if (matroska->level_up) { | |
1973 matroska->level_up--; | |
1974 break; | |
1975 } | |
1976 } | |
1977 | |
1978 return res; | |
1979 } | |
1980 | |
1868 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x)) | 1981 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x)) |
1869 | 1982 |
1870 static int | 1983 static int |
1871 matroska_aac_profile (char *codec_id) | 1984 matroska_aac_profile (char *codec_id) |
1872 { | 1985 { |
2002 /* file index (if seekable, seek to Cues/Tags to parse it) */ | 2115 /* file index (if seekable, seek to Cues/Tags to parse it) */ |
2003 case MATROSKA_ID_SEEKHEAD: { | 2116 case MATROSKA_ID_SEEKHEAD: { |
2004 if ((res = ebml_read_master(matroska, &id)) < 0) | 2117 if ((res = ebml_read_master(matroska, &id)) < 0) |
2005 break; | 2118 break; |
2006 res = matroska_parse_seekhead(matroska); | 2119 res = matroska_parse_seekhead(matroska); |
2120 break; | |
2121 } | |
2122 | |
2123 case MATROSKA_ID_ATTACHMENTS: { | |
2124 if ((res = ebml_read_master(matroska, &id)) < 0) | |
2125 break; | |
2126 res = matroska_parse_attachments(s); | |
2007 break; | 2127 break; |
2008 } | 2128 } |
2009 | 2129 |
2010 case MATROSKA_ID_CLUSTER: { | 2130 case MATROSKA_ID_CLUSTER: { |
2011 /* Do not read the master - this will be done in the next | 2131 /* Do not read the master - this will be done in the next |