Mercurial > libavformat.hg
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; |