annotate metadata.c @ 4387:5c42816e12c6 libavformat

Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This allows these functions to peek back and retrieve values from the demuxer's context (or RTSPState). The ASF/RTP payload parser will use this to be able to parse SDP values (which occur even before the payload ID is given), store them in the RTSPState and then retrieve them while parsing payload data. See "[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet() function pointer (was: transport context)" mailinglist thread.
author rbultje
date Fri, 06 Feb 2009 01:37:19 +0000
parents e4a1b568b313
children e62a61d3e591
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4150
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
1 /*
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
2 * copyright (c) 2009 Michael Niedermayer
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
3 *
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
4 * This file is part of FFmpeg.
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
5 *
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
10 *
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
14 * Lesser General Public License for more details.
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
15 *
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
19 */
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
20
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
21 #include "metadata.h"
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
22
4154
bd4d3fee45d0 rename AVMetaData to AVMetadata and meta_data to metadata
aurel
parents: 4150
diff changeset
23 AVMetadataTag *
4157
017e68062073 add a typedef for AVMetadata
aurel
parents: 4154
diff changeset
24 av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags)
4150
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
25 {
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
26 unsigned int i, j;
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
27
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
28 if(!m)
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
29 return NULL;
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
30
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
31 if(prev) i= prev - m->elems + 1;
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
32 else i= 0;
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
33
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
34 for(; i<m->count; i++){
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
35 const char *s= m->elems[i].key;
4250
2fc899894f5e replace AV_METADATA_IGNORE_CASE flag by a new AV_METADATA_MATCH_CASE flag
aurel
parents: 4180
diff changeset
36 if(flags & AV_METADATA_MATCH_CASE) for(j=0; s[j] == key[j] && key[j]; j++);
2fc899894f5e replace AV_METADATA_IGNORE_CASE flag by a new AV_METADATA_MATCH_CASE flag
aurel
parents: 4180
diff changeset
37 else for(j=0; toupper(s[j]) == toupper(key[j]) && key[j]; j++);
4150
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
38 if(key[j])
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
39 continue;
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
40 if(s[j] && !(flags & AV_METADATA_IGNORE_SUFFIX))
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
41 continue;
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
42 return &m->elems[i];
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
43 }
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
44 return NULL;
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
45 }
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
46
4353
e4a1b568b313 modify the way to pass parameters to av_metadata_set()
aurel
parents: 4250
diff changeset
47 int av_metadata_set(AVMetadata **pm, const char *key, const char *value)
4150
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
48 {
4157
017e68062073 add a typedef for AVMetadata
aurel
parents: 4154
diff changeset
49 AVMetadata *m= *pm;
4353
e4a1b568b313 modify the way to pass parameters to av_metadata_set()
aurel
parents: 4250
diff changeset
50 AVMetadataTag *tag= av_metadata_get(m, key, NULL, AV_METADATA_MATCH_CASE);
4150
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
51
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
52 if(!m)
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
53 m=*pm= av_mallocz(sizeof(*m));
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
54
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
55 if(tag){
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
56 av_free(tag->value);
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
57 av_free(tag->key);
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
58 *tag= m->elems[--m->count];
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
59 }else{
4154
bd4d3fee45d0 rename AVMetaData to AVMetadata and meta_data to metadata
aurel
parents: 4150
diff changeset
60 AVMetadataTag *tmp= av_realloc(m->elems, (m->count+1) * sizeof(*m->elems));
4150
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
61 if(tmp){
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
62 m->elems= tmp;
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
63 }else
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
64 return AVERROR(ENOMEM);
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
65 }
4353
e4a1b568b313 modify the way to pass parameters to av_metadata_set()
aurel
parents: 4250
diff changeset
66 if(value){
e4a1b568b313 modify the way to pass parameters to av_metadata_set()
aurel
parents: 4250
diff changeset
67 m->elems[m->count].key = av_strdup(key );
e4a1b568b313 modify the way to pass parameters to av_metadata_set()
aurel
parents: 4250
diff changeset
68 m->elems[m->count].value= av_strdup(value);
e4a1b568b313 modify the way to pass parameters to av_metadata_set()
aurel
parents: 4250
diff changeset
69 m->count++;
4150
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
70 }
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
71 if(!m->count)
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
72 av_freep(pm);
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
73
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
74 return 0;
6f4c0d5f1e23 Move metadata API from avcodec to avformat.
michael
parents:
diff changeset
75 }
4158
ea1e24175669 Add a metadata compatibility layer, so that when a user application set
aurel
parents: 4157
diff changeset
76
4161
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
77 void av_metadata_free(AVMetadata **pm)
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
78 {
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
79 AVMetadata *m= *pm;
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
80
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
81 if(m){
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
82 while(m->count--){
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
83 av_free(m->elems[m->count].key);
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
84 av_free(m->elems[m->count].value);
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
85 }
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
86 av_free(m->elems);
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
87 }
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
88 av_freep(pm);
6a7275621c02 free all allocated metadata structures
aurel
parents: 4159
diff changeset
89 }