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