mpegtsenc: handle multiple language tags per stream
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
		
							parent
							
								
									89e568feec
								
							
						
					
					
						commit
						435cebd015
					
				@ -283,12 +283,24 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
 | 
			
		||||
        /* write optional descriptors here */
 | 
			
		||||
        switch(st->codec->codec_type) {
 | 
			
		||||
        case AVMEDIA_TYPE_AUDIO:
 | 
			
		||||
            if (lang && strlen(lang->value) == 3) {
 | 
			
		||||
            if (lang) {
 | 
			
		||||
                char *p;
 | 
			
		||||
                char *next = lang->value;
 | 
			
		||||
                uint8_t *len_ptr;
 | 
			
		||||
 | 
			
		||||
                *q++ = 0x0a; /* ISO 639 language descriptor */
 | 
			
		||||
                *q++ = 4;
 | 
			
		||||
                *q++ = lang->value[0];
 | 
			
		||||
                *q++ = lang->value[1];
 | 
			
		||||
                *q++ = lang->value[2];
 | 
			
		||||
                len_ptr = q++;
 | 
			
		||||
                *len_ptr = 0;
 | 
			
		||||
 | 
			
		||||
                for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
 | 
			
		||||
                    next = strchr(p, ',');
 | 
			
		||||
                    if (strlen(p) != 3 && (!next || next != p + 3))
 | 
			
		||||
                        continue; /* not a 3-letter code */
 | 
			
		||||
 | 
			
		||||
                    *q++ = *p++;
 | 
			
		||||
                    *q++ = *p++;
 | 
			
		||||
                    *q++ = *p++;
 | 
			
		||||
 | 
			
		||||
                if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
 | 
			
		||||
                    *q++ = 0x01;
 | 
			
		||||
                else if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
 | 
			
		||||
@ -297,6 +309,12 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
 | 
			
		||||
                    *q++ = 0x03;
 | 
			
		||||
                else
 | 
			
		||||
                    *q++ = 0; /* undefined type */
 | 
			
		||||
 | 
			
		||||
                    *len_ptr += 4;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (*len_ptr == 0)
 | 
			
		||||
                    q -= 2; /* no language codes were written */
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case AVMEDIA_TYPE_SUBTITLE:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user