comparison avidec.c @ 5630:ebd8a1cc25e0 libavformat

Support strn tag in avidec.
author michael
date Fri, 05 Feb 2010 12:16:59 +0000
parents 4dc2cb60c431
children 5d3ac5652047
comparison
equal deleted inserted replaced
5629:4dc2cb60c431 5630:ebd8a1cc25e0
225 av_add_index_entry(st, pos+j, ts+j, FFMIN(max, size-j), 0, AVINDEX_KEYFRAME); 225 av_add_index_entry(st, pos+j, ts+j, FFMIN(max, size-j), 0, AVINDEX_KEYFRAME);
226 } 226 }
227 } 227 }
228 } 228 }
229 229
230 static int avi_read_tag(AVFormatContext *s, const char *key, unsigned int size) 230 static int avi_read_tag(AVFormatContext *s, AVStream *st, const char *key, unsigned int size)
231 { 231 {
232 ByteIOContext *pb = s->pb; 232 ByteIOContext *pb = s->pb;
233 char *value; 233 char *value;
234 234
235 size += (size & 1); 235 size += (size & 1);
237 if (size == UINT_MAX) 237 if (size == UINT_MAX)
238 return -1; 238 return -1;
239 value = av_malloc(size+1); 239 value = av_malloc(size+1);
240 if (!value) 240 if (!value)
241 return -1; 241 return -1;
242 get_strz(pb, value, size); 242 get_buffer(pb, value, size);
243 243 value[size]=0;
244
245 if(st)
246 return av_metadata_set2(&st->metadata, key, value,
247 AV_METADATA_DONT_STRDUP_VAL);
248 else
244 return av_metadata_set2(&s->metadata, key, value, 249 return av_metadata_set2(&s->metadata, key, value,
245 AV_METADATA_DONT_STRDUP_VAL); 250 AV_METADATA_DONT_STRDUP_VAL);
246 } 251 }
247 252
248 static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) 253 static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
600 size -= 9*4; 605 size -= 9*4;
601 } 606 }
602 url_fseek(pb, size, SEEK_CUR); 607 url_fseek(pb, size, SEEK_CUR);
603 break; 608 break;
604 case MKTAG('I', 'N', 'A', 'M'): 609 case MKTAG('I', 'N', 'A', 'M'):
605 avi_read_tag(s, "Title", size); 610 avi_read_tag(s, NULL, "Title", size);
606 break; 611 break;
607 case MKTAG('I', 'A', 'R', 'T'): 612 case MKTAG('I', 'A', 'R', 'T'):
608 avi_read_tag(s, "Artist", size); 613 avi_read_tag(s, NULL, "Artist", size);
609 break; 614 break;
610 case MKTAG('I', 'C', 'O', 'P'): 615 case MKTAG('I', 'C', 'O', 'P'):
611 avi_read_tag(s, "Copyright", size); 616 avi_read_tag(s, NULL, "Copyright", size);
612 break; 617 break;
613 case MKTAG('I', 'C', 'M', 'T'): 618 case MKTAG('I', 'C', 'M', 'T'):
614 avi_read_tag(s, "Comment", size); 619 avi_read_tag(s, NULL, "Comment", size);
615 break; 620 break;
616 case MKTAG('I', 'G', 'N', 'R'): 621 case MKTAG('I', 'G', 'N', 'R'):
617 avi_read_tag(s, "Genre", size); 622 avi_read_tag(s, NULL, "Genre", size);
618 break; 623 break;
619 case MKTAG('I', 'P', 'R', 'D'): 624 case MKTAG('I', 'P', 'R', 'D'):
620 avi_read_tag(s, "Album", size); 625 avi_read_tag(s, NULL, "Album", size);
621 break; 626 break;
622 case MKTAG('I', 'P', 'R', 'T'): 627 case MKTAG('I', 'P', 'R', 'T'):
623 avi_read_tag(s, "Track", size); 628 avi_read_tag(s, NULL, "Track", size);
624 break; 629 break;
630 case MKTAG('s', 't', 'r', 'n'):
631 if(s->nb_streams){
632 avi_read_tag(s, s->streams[s->nb_streams-1], "Title", size);
633 break;
634 }
625 default: 635 default:
626 if(size > 1000000){ 636 if(size > 1000000){
627 av_log(s, AV_LOG_ERROR, "Something went wrong during header parsing, " 637 av_log(s, AV_LOG_ERROR, "Something went wrong during header parsing, "
628 "I will ignore it and try to continue anyway.\n"); 638 "I will ignore it and try to continue anyway.\n");
629 avi->movi_list = url_ftell(pb) - 4; 639 avi->movi_list = url_ftell(pb) - 4;